[Elixir]GenServer/Agent/Taskの起動元

ElixirにはGenServer、Agent、Taskといったモジュールが存在します。これらは状態の保持やプロセスの起動などに特化したもの、汎用的なものといった役割の区分があります。

ちょっと、それらがどのように起動(start/start_link)されているのかちょっと見てみようと思ったので、そのメモです。

GenServer

コード(Elixir 1.0.5)

Task

Taskは、 start_link すると、 Supevisorの :simple_one_for_one のstrategyで Task.Supervised を起動するようです。コード(Elixir 1.0.5)

少し追って Task.Supervised をみると、Erlangの :proc_lib を起動しているようですね。
(Elixir 1.0.5)

proc_libってなんだろう?と思ってみると、Erlangの以下のモジュールのよう。

http://www.erlang.org/doc/man/proc_lib.html

Functions for asynchronous and synchronous start of processes adhering to the OTP design principles.

OTPデザインの原則に従った、同期/非同期のプロセス起動を担うらしいです。

http://shibu.jp/erlang/design_principles/sys_and_proc_lib.html

Agent

Agentは、 GenServer を使っているようです。(Elixir 1.0.5)

ここから、Agent.Servereへ向かっているよう。(Elixir 1.0.5)


なるほどー。send/receiveをElixir独自でごにょごにょしていると思っていたら、基本Erlang/OTPの資産を使っているのですね。

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.