1

スーパーバイザーを実装するとき..スーパーバイザーモジュールで、次のようなことをすると

init([_]) ->
{ok,
{{one_for_one, 5, 60},
[{reverse, {reverse, start_reverse, []}, permanent, brutal_kill, worker,[]}]}}.

逆関数は次のとおりです。

start_reverse() ->
Pid=spawn(?MODULE,reverse,[])。

どの場合でも start_reverse 関数は正常に終了するため、機能しません。ただし、次のような行を追加すると:

start_reverse() ->
Pid=spawn(?MODULE,reverse,[]),
{ok,Pid}.

関数が正常に終了した場合でも機能します。誰かが理由を説明できますか?

4

2 に答える 2

5

簡単に、

問題は、supervisorがプロセスのシャットダウンと初期化をサポートするために特定の呼び出し規則を必要とすることです。低レベルのコードは、spawnその規則を無視します。あなたはどちらかすべきです

  • gen_something 動作を使用するのgen_serverが最も一般的です。
  • を使用してプロセスを生成しますproc_lib
  • 使うsupervisor_bridge

そうしないと、コードで OTP をまったく利用できなくなります。そして、あなたはそれを望んでいます。

于 2011-05-03T10:45:14.593 に答える
1

実際には..スーパーバイザーの子プロセスがgen_server. スーパーバイザーのドキュメントには、具体的に次のように記載されています

start 関数は、子プロセスを作成してリンクする必要があり、{ok,Child} または {ok,Child,Info} を返す必要があります。ここで、Child は子プロセスの pid であり、Info はスーパーバイザーによって無視される任意の用語です。

これが、返品したときに機能した理由{ok, Pid}です..

于 2011-05-03T16:16:23.183 に答える