公式ドキュメント
shutdown
-type shutdown() :: brutal_kill | timeout().
brutal_kill
直ぐに kill
exit(Child, kill)
Timeout::integer()
exit(Child, shutdown)- (Timeoutミリ秒待つ)
exit(Child, kill)
infinity
ずっと待つ
子プロセスがSupervisorの場合、 infinity で良い。
( 子プロセスがWorkerの場合は気を付けなければならない )
ChildSpecをmapで指定しshutdownを省略した場合のデフォルト値は
- typeが
workerの場合は5000 - typeが
supervisorの場合はinfinity
supervisor:terminate_child/2
-spec terminate_child(SupRef, Id) -> Result when
SupRef :: supervisor:sup_ref(),
Id :: pid() | supervisor:child_id(),
Result :: ok | {error, Error},
Error :: not_found | simple_one_for_one.
この関数を実行すると、 shutdown の指定に従って停止される。
Id の値は simple_one_for_one 以外 の場合は supervisor:child_id() (not pid() )、
( pid() を指定すると {error, not_found} が返る)
simple_one_for_one の場合は pid() を指定する
( supervisor:child_id() を指定すると {error, simple_one_for_one} が返る)
(エラーの内容が対称的ではないのが悲しい…)
simple_one_for_one の停止
simple_one_for_one のSupervisorで子プロセスを停止させる場合は supervisor:terminate_child(SupRef, Id). を実行する。
この場合の Id は pid() しか使えない。
( child_id() (のようなもの)を使おうとすると {error, simple_one_for_one} が変える。)
simple_one_for_one の場合は supervisor:terminate_child(SupRef, Id) した時点でSupervisorからChildSpecが削除される
(
supervisor:delete_child(SupRef, Id) を呼ぶ必要がない)
(ちなみに、delete_childの Id はterminate_childの Id::pid()|supervisor:child_id() と違い Id::child_id() である。 simple_one_for_one の時に terminate_child と delete_child のどっちを呼んだらいいか迷った時はこの辺りをイメージしてみればわかるかもしれない(逆もまた然り))