GParsの?Actor Model

Preview:

Citation preview

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である」という哲学• 実装は様々• 並行/並列基礎勉強会では喋りません