Skip to content

Latest commit

 

History

History
96 lines (78 loc) · 2.87 KB

15.2.md

File metadata and controls

96 lines (78 loc) · 2.87 KB

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

  1. サーバープロセスとして Ticker.generator(clients) のプロセスを生成する
  2. 「1」で生成したプロセスを :ticer という名前で登録する
    プロセスを登録するのに :global.register_name(Name, Pid) を使う

Ticker.register(client_pid) クライアントが呼び出す関数 サーバープロセスにクライアントのPIDを登録するようメッセージを送る サーバープロセスのPIDを解決するために、 :global.whreris_name(Name) を使う

クライアントはサーバープロセスに直接メッセージを送れるが、インターフェースとなる関数を用意して、登録処理の詳細を隠蔽できる => クライアントとサーバーの分離に役立つ 変更する際の柔軟性を提供する

Ticker.generator(clients) Ticker.start が生成したプロセス(サーバープロセス)で動作する

  1. {:regerator, PID} を受信した場合
    リストにクライアントのPIDを詰めて、再帰する
  2. 上記以外
    2秒後にタイムアウト
    リストに登録されている全てのクライアントに {:tick} メッセージを送り、再帰する

Client.start

  1. クライアントとして Client.receiver のプロセスを生成する
  2. 「1」で生成したプロセスのPIDを引数にして Ticker.register(pid) を呼び出す
    このとき呼び出している register はローカルのもの
    register:ticker というプロセスを探して、メッセージを送る

Client.receiver

  1. {:tick} を受信
  2. メッセージを出力して、再帰

プロセスを名付けるタイミング

  • アプリケーション開始時に名前を登録
  • mix.exs に名前を登録