Skip to content

Latest commit

 

History

History
60 lines (43 loc) · 1.89 KB

14.3.md

File metadata and controls

60 lines (43 loc) · 1.89 KB

明示的に指示しない限り、プロセスが終了したことは通知されない

goh@goh% elixir -r spawn/link1.exs
Nothing happened as far as I concerned

二つのプロセスをリンクする

spawn_link(module, fun, args) プロセスを生成し、呼び出し元のプロセスとリンクする 子プロセスが死ぬと親プロセスも死ぬ

一方の死を扱う場合、OTPを使う OTPはプロセス監視の役割も担う

ref. Ch.17 OTP: スーパーバイザ

goh@goh% elixir -r spawn/link2.exs
** (EXIT from #PID<0.89.0>) :boom

リンクしたプロセスの終了をトラップすることで、終了シグナルを処理することもできる

goh@goh% elixir -r spawn/link3.exs
MESSAGE RECEIVED: {:EXIT, #PID<0.94.0>, :boom}

Process.flag(flag, value) flagにvalueを設定する :trap_exittrue が設定された場合、exitシグナルを捉えてtuple {'EXIT', From, Reason} に変換する

ref. erlang:process_flag/2

プロセスのモニタ(監視) リンクもモニタもプロセスを生成する

  • リンク: 双方向
    片方の通知をもう一方が受信する
  • モニタ: 一方向
    モニタしている方は通知を受信するが、されている方は受信しない

Kernel.spawn_monitor(module, fun, args) プロセスを生成し、監視する

Process.monitor(item) プロセスを指定し、監視する monitor で監視する前にプロセスが終了すると通知を受けないので注意

goh@goh% elixir -r spawn/monitor1.exs
{#PID<0.94.0>, #Reference<0.2219066720.3266052098.83504>}
MESSAGE RECEIVED: {:DOWN, #Reference<0.2219066720.3266052098.83504>, :process, #PID<0.94.0>, :boom}

一つのプロセスが失敗したら、別のプロセスも終了させたい => リンク プロセスの終了を知りたい => モニタ