5

gen_server と Supervisor:test_servertest_sup. シェル/CLI からテストしたい。start_link名前がローカルに登録されるように関数を記述しました。

test_serverコマンドラインから問題なく生成できることがわかりましたが、生成test_supされた ではサーバーとのやり取りがまったくできません。

たとえば、次のコマンドtest_serverを実行して a を生成できます。

1> spawn(test_server, start_link, []).
<0.39.0>
2> registered().
[...,test_server,...]

サーバーと対話でき、すべて正常に表示されます。

ただし、 で同じことをしようとするとtest_sup、「CLI プロセス」( を使用registered/0) に新しい名前/Pid が登録されません。私のtest_serverは生成されたように見えますが、それと対話することはできません (これが本当である理由については、SASL に関する Lukas Larsson のコメントを参照してください)。

スーパーバイザーでエラーをコーディングしたと思いますが、スーパーバイザーを起動するこの方法は完全に正常に機能します。

1> {ok, Pid}= test_sup:start_link([]).
{ok, <0.39.0>}
2> unlink(Pid).
true
3> registered().
[...,test_server,test_sup,...]

gen_server を作成できるのにスーパーバイザを作成できないのはなぜですか?


アップデート

私が使用しているコードは、この投稿にあります。私はecho_serverecho_sup、2 つの非常に単純なモジュールを使用しています。

そのコードを考えると、これは機能します:

spawn(echo_server, start_link, []).

これはしません:

spawn(echo_sup, start_link, []).
4

2 に答える 2

4

これらのことを理解しようとするときはいつでも、通常、SASL を有効にすると非常に役に立ちます。

アプリケーション: 開始 (sasl)。

そうすれば、上司が終了する理由を知ることができれば幸いです。

于 2010-05-07T06:23:37.317 に答える
2

この説明は、Erlang Questions メーリング リストで Bernard Duggan によって提供されました。

リンクされたプロセスは、リンクされているプロセスがコード「通常」で終了しても、自動的に終了しません。そのため、生成プロセスが終了しても [echo_server] は終了しません。では、なぜ監督者は死ぬのでしょうか。スーパーバイザ モジュールの内部は、実際にはそれ自体が gen_server として実装されていますが、process_flag(trap_exit, true) が設定されています。この結果、親プロセスが終了すると、terminate() が呼び出され (trap_exit が無効になっている場合は発生しません)、スーパーバイザーがシャットダウンします。スーパーバイザーはスーパーバイザー ツリー内の親によって生成されるため、スーパーバイザーのコンテキストでは理にかなっています。理由が何であれ、親がシャットダウンするたびにスーパーバイザーが死ななかった場合、ツリーの「枝」がぶら下がっていることになります。

于 2010-05-10T04:09:26.063 に答える