197x 20090704 Scalaで並行プログラミング

4,854 views

Published on

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,854
On SlideShare
0
From Embeds
0
Number of Embeds
150
Actions
Shares
0
Downloads
17
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

197x 20090704 Scalaで並行プログラミング

  1. 1. Scalaで並行プログラミング NetPenguin
  2. 2. 自己紹介 • NetPenguin – http://d.hatena.ne.jp/NetPenguin/ – http://twitter.com/NetPenguin/ • プログラマ(否SE) • Java, Scala, C/C++, PHP, etc... • Scala-be – http://groups.google.co.jp/group/scala-be 2
  3. 3. 目次 • Scala • アクターモデル • Scalaのアクターライブラリ • まとめ 3
  4. 4. Scala • オブジェクト指向+関数型 • JVM上で動作 • ScalaからJavaのライブラリを利用可能 JavaからScalaのメソッドを呼び出すことも可能 • 変態豊富な言語機能 – Implicit parameter, Implicit conversion, Trait, Structual typing, Pattern match – Partial Function, タプル, Immutableなリスト, etc... 4
  5. 5. Scala • その他 – TwitterもScalaで動いているらしいです – マスコットキャラも出来たようです・・・ 5
  6. 6. • 魔法少女 Scala ちゃん id:secondlife さんのところから拝借しました。 ●http://subtech.g.hatena.ne.jp/secondlife/20090701/1246418689# 6
  7. 7. アクターモデル • 全てのものはアクターである – OOの「すべてのものはオブジェクトである」 と同じようなもの • 基本的に非同期メッセージを使用 – OOでは基本的に同期メッセージ – アクタ間のやり取りはメッセージのみ • 状態は各アクターに閉じている 7
  8. 8. 自然と並行に動作可能 8
  9. 9. Scalaのアクターライブラリ • 特徴 – 言語の一部のように見える構文 – パターンマッチ – スレッドを無駄使いしない • やれること – アクターの生成/開始 – メッセージ送信 – メッセージ受信 – メッセージ返信 9
  10. 10. アクターの生成/開始(1) • Actorクラスを継承 – Actorクラスを継承し、actメソッドを実装する – start メソッドを呼び出して、アクターを開始する class SampleActor extends Actor { def act():Unit = { : } } object Sample { def main(args: Array[String]):Unit = { new SampleActor().start } } 10
  11. 11. アクターの生成/開始(2) • Actor.actor メソッドで生成 – actor に続くブロックが act メソッドに相当 – ただちに開始される(start不要) import scala.actors.Actor.actor object Sample { def main(args: Array[String]):Unit = { actor { : : } } } 11
  12. 12. メッセージ送信 • 任意のオブジェクトを送信可能 • !、!?、!!でメッセージ送信 – ! → 一方通行 – !? → 返信を待つ – !! → 返信受信時にコールバック def main(args: Array[String]):Unit = { val sample = actor { ... } sample ! “message” // 文字列を送信 println(sample !? 1) // 数値を送信、返信を出力 } 12
  13. 13. メッセージ受信(1) • receiveで受信 – メッセージが届くまでスレッドを止めて待つ (メッセージ待ち中もスレッドを消費する) – reveiveの外側に値を返すことができる actor { val result = receive { case t: String => println(“receive text. text=”+t) “text” // result == “text” になる case 1 => println(“receive number.”) “number” // result == “number” になる } } 13
  14. 14. メッセージ受信(2) • reactで受信 – メッセージ処理中のみスレッドを使用する – reactの外側に値を返すことはできない actor { react { case t: String => println(“receive text. text=”+t) case 1 => println(“receive number.”) } } 14
  15. 15. メッセージ受信(その他) • 受信を繰り返す – loopで囲う actor { loop { react { case t: String => println(“receive text. text=”+t) case 1 => println(“receive number.) } } } 15
  16. 16. メッセージ返信 • reply で返信 – 任意のオブジェクトを返信できる – !?, !! によるメッセージ送信側で受け取ることができる actor { loop { react { case t: String => reply “receive ”+t case 1 => reply “receive 1st” } } } 16
  17. 17. 試してみた • クイックソート – 10,000個の整数をソート×100回 • すべてをアクターにしてみた – 分割(Separator) – 結合(Combaine) • 大量にアクターを生成 – 分割毎にアクタ生成 ※ソースはhttp://svn.coderepos.org/share/lang/scala  /sandbox/samples/actor/ に置いてあります 17
  18. 18. 結果 • CPU使用率80~90% (Core2Quad 2.4GHz) 18
  19. 19. 結果 • すべてをアクターにすると – メモリを大量消費 – オーバーヘッドで遅かった(10倍くらい) • 通常のソート → 2~3秒 • アクター使用 → 28秒 _| ̄|○ 19
  20. 20. まとめ • 自然と並行処理になる • 同期処理不要 • CPUパワーを余すことなく使える • アクターの粒度はほどほどに 20
  21. 21. ご静聴、ありがとうございました。 21

×