PIDは以下の値で構成されている
- ノードのID
- プロセスID(下位ビット)
- プロセスID(上位ビット)
PIDに名前をつけられる
ノード one
goh@goh% iex --sname one
Erlang/OTP 21 [erts-10.0.6] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]
Interactive Elixir (1.7.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(one@goh)1> c("ticker.ex")
[Client, Ticker]
iex(one@goh)2> Node.connect :two@goh
true
iex(one@goh)3> Ticker.start
:yes
tick
tick
iex(one@goh)4> Client.start
registering #PID<0.123.0>
{:register, #PID<0.123.0>}
tick
tock in client
tick
tock in client
tick
tock in client
registering #PID<14076.118.0>
tick
tock in client
tick
tock in client
tick
tock in client
ノード two
goh@goh% iex --sname two
Erlang/OTP 21 [erts-10.0.6] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]
Interactive Elixir (1.7.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(two@goh)1> c("ticker.ex")
[Client, Ticker]
iex(two@goh)2> Client.start
{:register, #PID<0.118.0>}
tock in client
tock in client
tock in client
Ticker.start
- サーバープロセスとして
Ticker.generator(clients)
のプロセスを生成する - 「1」で生成したプロセスを
:ticer
という名前で登録する
プロセスを登録するのに:global.register_name(Name, Pid)
を使う
Ticker.register(client_pid)
クライアントが呼び出す関数
サーバープロセスにクライアントのPIDを登録するようメッセージを送る
サーバープロセスのPIDを解決するために、 :global.whreris_name(Name)
を使う
クライアントはサーバープロセスに直接メッセージを送れるが、インターフェースとなる関数を用意して、登録処理の詳細を隠蔽できる => クライアントとサーバーの分離に役立つ 変更する際の柔軟性を提供する
Ticker.generator(clients)
Ticker.start
が生成したプロセス(サーバープロセス)で動作する
{:regerator, PID}
を受信した場合
リストにクライアントのPIDを詰めて、再帰する- 上記以外
2秒後にタイムアウト
リストに登録されている全てのクライアントに{:tick}
メッセージを送り、再帰する
Client.start
- クライアントとして
Client.receiver
のプロセスを生成する - 「1」で生成したプロセスのPIDを引数にして
Ticker.register(pid)
を呼び出す
このとき呼び出しているregister
はローカルのもの
register
で:ticker
というプロセスを探して、メッセージを送る
Client.receiver
{:tick}
を受信- メッセージを出力して、再帰
プロセスを名付けるタイミング
- アプリケーション開始時に名前を登録
mix.exs
に名前を登録