gparsの?actor model
TRANSCRIPT
GParsの? Actor Model
pocketberserker
2013年 3月 9日
自己紹介
• 中山 /なかやん /ぺんぎん• @pocketberserker / id:pocketberserker• どこにでもいるふつーのぺんぎん• F# / Haskell / Erlang / Scala / TDD• FSharpx、Scalazのこんとりびゅーた• Groovyは…イベントでたまに使う?
発表者になった経緯とか
宇佐美ミィさん(仮称)の質問に答えていたら発表者になっていた
発表者になった経緯とか
宇佐美ミィさん(仮称)の質問に答えていたら発表者になっていた
本題の前に…
• Actorモデルを知っている?• GParsを知っている?• Actorモデルを使い倒している?• GParsのActorを使い倒している?
本題の前に…
• Actorモデルを知っている?
• GParsを知っている?• Actorモデルを使い倒している?• GParsのActorを使い倒している?
本題の前に…
• Actorモデルを知っている?• GParsを知っている?
• Actorモデルを使い倒している?• GParsのActorを使い倒している?
本題の前に…
• Actorモデルを知っている?• GParsを知っている?• Actorモデルを使い倒している?
• GParsのActorを使い倒している?
本題の前に…
• Actorモデルを知っている?• GParsを知っている?• Actorモデルを使い倒している?• GParsのActorを使い倒している?
謝罪
GParsまで行き着くかわかりません
謝罪
GParsまで行き着くかわかりません
Actor Modelとは
• 並行計算モデルの一つ• メッセージパッシングの一つ• Actor =計算実体(Computational Entity)• 哲学「全てのものはActorである」• 操作的意味論
Actor Modelとは
• 並行計算モデルの一つ
• メッセージパッシングの一つ• Actor =計算実体(Computational Entity)• 哲学「全てのものはActorである」• 操作的意味論
Actor Modelとは
• 並行計算モデルの一つ• メッセージパッシングの一つ
• Actor =計算実体(Computational Entity)• 哲学「全てのものはActorである」• 操作的意味論
Actor Modelとは
• 並行計算モデルの一つ• メッセージパッシングの一つ• Actor =計算実体(Computational Entity)
• 哲学「全てのものはActorである」• 操作的意味論
Actor Modelとは
• 並行計算モデルの一つ• メッセージパッシングの一つ• Actor =計算実体(Computational Entity)• 哲学「全てのものはActorである」
• 操作的意味論
Actor Modelとは
• 並行計算モデルの一つ• メッセージパッシングの一つ• Actor =計算実体(Computational Entity)• 哲学「全てのものはActorである」• 操作的意味論
Actorの振る舞い
• Actorに有限個のメッセージを送信• 有限個の新たなActorの生成• メッセージを受信し、受信したメッセージに応じた動作を行う
• 上記振る舞いを並列的に実行する
Actorの振る舞い
• Actorに有限個のメッセージを送信
• 有限個の新たなActorの生成• メッセージを受信し、受信したメッセージに応じた動作を行う
• 上記振る舞いを並列的に実行する
Actorの振る舞い
• Actorに有限個のメッセージを送信• 有限個の新たなActorの生成
• メッセージを受信し、受信したメッセージに応じた動作を行う
• 上記振る舞いを並列的に実行する
Actorの振る舞い
• Actorに有限個のメッセージを送信• 有限個の新たなActorの生成• メッセージを受信し、受信したメッセージに応じた動作を行う
• 上記振る舞いを並列的に実行する
Actorの振る舞い
• Actorに有限個のメッセージを送信• 有限個の新たなActorの生成• メッセージを受信し、受信したメッセージに応じた動作を行う
• 上記振る舞いを並列的に実行する
メッセージの送受信は並行
• メッセージの送受信順序は不確定• 最初に送信したメッセージが最初に届く保証は無い
メッセージの送受信は並行
• メッセージの送受信順序は不確定
• 最初に送信したメッセージが最初に届く保証は無い
メッセージの送受信は並行
• メッセージの送受信順序は不確定• 最初に送信したメッセージが最初に届く保証は無い
さて
このあたりで公理的法則群の一部を見てみましょう
Actor Systemの公理的法則群
Henry Baker “Laws for Communicating ParallelProcesses”
ActorであるA自身とAの隣人の集合� �acquaintances*(A) =
{A} U acquaintances(A)
U acquaintances2(A) U ... (ad infinitum)� �
イベントE
Actor計算における離散的なステップ
イベントEの表記� �[T <˜˜ M]� �• messenger(E) . . .送る側のメッセージ• terget(E) . . . Eにおいてメッセージを受け取る
Eと直接関係するものの集合� �participants(E) = {target(E), messenger(E))� �
E1とE2の依存表記� �El ++> E2� �• E1が発生したらE2が活性化される• 一般に半順序(要素が必ずしも比較可能ではない)
• EがE1 . . . Enを活性化することで fork(分岐)を引き起こす可能性がある
足し算の例
1. 足し算に必要なデータと返信先をActorに送る
2. 計算結果を指定された返信先に送る
3 + 4の例� �[+ <˜˜ [request: [3 4], reply-to: c]]
+
+
V
[c <˜˜ [reply: 7]]� �
一つめのイベント� �[+ <˜˜ [request: [3 4], reply-to: c]]� �• タプル [3 4]という引数• “計算結果を cに送信すべき”という継続• これらのメッセージを+に送信する
ふたつめのイベント� �[c <˜˜ [reply: 7]]� �• 計算結果 7を返信データとして cに送信する
simple primitive actorの記述方法� �[x <˜˜ [request: m, reply-to: c)]� �• 計算結果 7を返信データとして cに送信する
階乗の例� �[factorial <˜˜ [request: [3], reply-to: c]]
+
V
[loop <(˜˜ [request: [3 1], reply-to: c]]
+
+
V
[ loop <˜˜ [request: [2 3], reply-to: c]]
+
+
V
[loop <˜˜ [request: [1 6], reply-to: c]]
+
+
V
[c <˜˜ [reply: 6]]� �
factorial内の loop
• factorialは loopを呼び出す• loopは [index product]という引数が必要• indexが 1なら結果を返す継続を実行• indexが 1以外なら [(index - 1) (index *
product)]を引数としたメッセージを loopに送る
• indexの初期値は factorialで受け取ったデータ(ここでは 3)
• productの初期値は 1
こんな感じで . . .
• 論文では公理的法則群が書かれている• Arrival Orderingsで到着順序の話とか• ラムダ計算の記述例などが続く• が、長いのでここでは飛ばす
こんな感じで . . .
• 論文では公理的法則群が書かれている
• Arrival Orderingsで到着順序の話とか• ラムダ計算の記述例などが続く• が、長いのでここでは飛ばす
こんな感じで . . .
• 論文では公理的法則群が書かれている• Arrival Orderingsで到着順序の話とか
• ラムダ計算の記述例などが続く• が、長いのでここでは飛ばす
こんな感じで . . .
• 論文では公理的法則群が書かれている• Arrival Orderingsで到着順序の話とか• ラムダ計算の記述例などが続く
• が、長いのでここでは飛ばす
こんな感じで . . .
• 論文では公理的法則群が書かれている• Arrival Orderingsで到着順序の話とか• ラムダ計算の記述例などが続く• が、長いのでここでは飛ばす
Actorの表現� �[F <˜˜ [request: argument-tuple, reply-to: continuation]]
[continuation <˜˜ [reply: answer]]
[X <˜˜ [request: message, reply-to: C]]� �
Actorの実装例
• Erlangのあれ• ScalaのAkka• GParsのActor• etc . . .
Actorの実装
• 実装方法は様々• fault-toleranceな方向は共通• let it crash(クラッシュさせちゃいなよ)
Actorの実装
• 実装方法は様々
• fault-toleranceな方向は共通• let it crash(クラッシュさせちゃいなよ)
Actorの実装
• 実装方法は様々• fault-toleranceな方向は共通
• let it crash(クラッシュさせちゃいなよ)
Actorの実装
• 実装方法は様々• fault-toleranceな方向は共通• let it crash(クラッシュさせちゃいなよ)
話していないこと
• スケーラビリティ(Lock Freeとの差はうさみみさんが並行/並列基礎勉強会で話してくれるかと)
• OneForOne、OneForAll• メッセージは immutable云々
まとめ
• 「全てのものはActorである」という哲学• 実装は様々• 並行/並列基礎勉強会では喋りません