質問
スーパーバイザーを実装するとき..スーパーバイザーモジュールで、私は次のようなことをしている場合
init([_]) - >
{わかった、
{{one_for_one、5、60}、
{reverese、{ruced、start_reverse、[]}、永続、brutal_kill、worker、[]}]}}。
逆関数は次のとおりです。
start_reverse() - >
pid = spawn(?モジュール、逆、[])。
すべての場合にstart_reverse関数が正常に終了するため、機能しません。ただし、このような行を追加すると:
start_reverse() - >
pid = spawn(?モジュール、逆、[])、
{OK、PID}。
機能が通常終了する場合でも、機能します。誰かがその理由を説明できますか?
解決
実際、監督者の子どものプロセスが gen_server
. 。監督者 ドキュメンテーション 具体的にはそれについて言及しています
開始関数は、子プロセスを作成してリンクする必要があり、{OK、子}または{OK、子、情報}を返す必要があります。ここで、子は子のプロセスのPIDであり、監督者が無視する任意の用語です。
それがあなたが戻ったときの理由です {ok, Pid}
出来た..
他のヒント
簡単に、
問題は、 supervisor
プロセスのシャットダウンと初期化をサポートするための特定の呼び出し条約が必要です。低レベルのコード spawn
その慣習を無視します。どちらもすべきです
- GEN_SOMTHESHONISEの動作を使用してください。
gen_server
最も一般的です。 - 使用してプロセスをスポーンします
proc_lib
- 使う
supervisor_bridge
それ以外の場合、コードはOTPをまったく利用しません。そして、あなたはそれを望んでいます。
所属していません StackOverflow