質問

スーパーバイザーを実装するとき..スーパーバイザーモジュールで、私は次のようなことをしている場合

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をまったく利用しません。そして、あなたはそれを望んでいます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top