明示的に指示しない限り、プロセスが終了したことは通知されない
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_exit
に true
が設定された場合、exitシグナルを捉えてtuple {'EXIT', From, Reason}
に変換する
プロセスのモニタ(監視) リンクもモニタもプロセスを生成する
- リンク: 双方向
片方の通知をもう一方が受信する - モニタ: 一方向
モニタしている方は通知を受信するが、されている方は受信しない
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}
一つのプロセスが失敗したら、別のプロセスも終了させたい => リンク プロセスの終了を知りたい => モニタ