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