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