問題タブ [erlang-supervisor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
228 参照

erlang - one_for_one スーパーバイザーが子を再起動できないことを補う: tcp/ip ポートリスナー

tcp/ip 機能をカプセル化する一般的な動作を作成しました。動作のユーザーがしなければならないことは、ソケットの反対側にあるものから来る、解析された「コマンド」を処理するコールバックを実装することだけです。

私の一般的な動作は、gen_tcp:accept 経由でポートをリッスンするポート リスナー プロセスを作成します。誰かがポートに接続すると、ポートリスナーはスーパーバイザーに新しいポートリスナーをスピンアップするように要求し、その間、接続したばかりのクライアントとのソケット通信を処理します。これらのポート リスナー/ソケット ハンドラーはそれぞれ動的に作成され、同一であるため、simple_one_for_one スーパーバイザーを使用してそれらを作成しています。標準的なもの。

これが私の質問です。ポートをリッスンするプロセスが停止すると、ポートをリッスンするものがないため、動作全体が機能しなくなります。port-listener は simple_one_for_one スーパーバイザによって作成されるため、スーパーバイザは新しい port_listener を再起動できません。

では、「最新の」ポート リスナーを監視し、それが停止した場合に別のポート リスナーを開始するようスーパーバイザーに要求する keep_alive プロセスを作成する必要がありますか? または、このタイプのケースには他のベスト プラクティスがあります。

また、この動作によって作成されたプロセスを確認/調べる方法はありますか? これはアプリケーションではないため、appmon はここでは機能しません。

ありがとう

0 投票する
2 に答える
484 参照

erlang - Simple_one_for_oneアプリケーション

simple_one_for_oneの子を開始するスーパーバイザーがいます。実際、各子は独自のツリーを持つスーパーバイザーです。それぞれの子供は一意のIDで始まるので、私はそれらを区別することができます。次に、各gen_serverはstart_link(Id)で開始されます。ここで、

したがって、各gen_serverは{global、{Id、module_name}}で簡単に追加できます。

ここで、この子スーパーバイザーをアプリケーションにします。したがって、私の母のスーパーバイザーは、スーパーバイザーではなくアプリケーションを開始する必要があります。IDをアプリケーションに渡すという一部を除いて、これは簡単なはずです。IDでスーパーバイザーを開始するのは簡単です:supervisor:start_child(?SERVER、[Id])。アプリケーションでそれを行うにはどうすればよいですか?同じ名前の複数のアプリケーションを(同じ.appファイルにアクセスできるように)異なるIDで起動するにはどうすればよいですか(子供をsupervisor:start_child(?SERVER、[Id]))で起動できますか?

私の質問が十分に明確でない場合は、ここに私のコードがあります。したがって、現在、es_simulator_dispatcherはes_simulator_supを開始します。これが欲しいのですが、es_simulator_dispatcherはes_simulator_appを開始し、es_simulator_supはes_simulator_supを開始します。それがすべてです:-)

よろしくお願いします、dijxtra

0 投票する
2 に答える
1670 参照

erlang - Erlang: スーパーバイザの下で複数のプロセスを生成する

私は単純なスーパーバイザーを実装しようとしていますが、失敗した場合は子プロセスを再起動するだけです。しかし、スーパーバイザーの下で複数のプロセスを生成する方法さえ知りません! このサイトで簡単なスーパーバイザー コードを調べたところ、何かが見つかりました

init() 関数に「echo_server2」の部分を配置すると、このスーパーバイザーの下で別のプロセスが生成されると想定しましたが、例外 exit:shutdown メッセージが表示されます。

ファイル「echo_server」と「echo_server2」は同じコードですが、名前が異なります。だから私は今混乱しています。

0 投票する
1 に答える
592 参照

erlang - erlangスーパーバイザーの再起動戦略

特定のスーパーバイザーの子として、いくつかのプロセスを開始したいと思います。再起動の戦略は次のとおりですone_for_one。私のニーズでは、終了するすべてのプロセスは、指定された時間(たとえば、20秒)後に再起動する必要があります。

これはどのように行うことができますか?たぶん、initまたはterminate関数に次の組み合わせで遅延が発生します。

これを達成するためのより良い方法はありますか?

0 投票する
1 に答える
1252 参照

erlang - Erlang スーパーバイザー。プロセスを再起動します。何度か失敗した場合は、あきらめてメッセージを送信します

gen_serverハードウェアセンサーからの情報を定期的に要求するワーカーが何人かいます。センサーが一時的に故障する場合がありますが、これは正常です。センサーが失敗した場合、ワーカーは例外で終了します。

simple_one_to_oneすべてのワーカーは、戦略を持つスーパーバイザーから生成されます。またgen_server、ワーカーを開始および停止し、'DOWN'メッセージを受信できるコントロールもあります。

だから今私は2つの問題があります:

  1. ワーカーがスーパーバイザーによって再起動されると、その状態が失われます。これは私には受け入れられません。同じ状態でワーカーを再作成する必要があります。

  2. ワーカーが一定期間に数回失敗する場合は、センサーに重大な問題が発生しており、オペレーターの注意が必要です。したがって、ワーカーの再起動をあきらめて、イベント ハンドラーにメッセージを送信する必要があります。ただし、スーパーバイザーのデフォルトの動作は、プロセスの再起動制限を使い果たした後に終了します。

2 つの解決策があります。

  1. スーパーバイザでプロセスのタイプを一時的に設定し、それらを制御して、制御で再起動しますgen_server。しかし、これはまさにスーパーバイザーが行うべきことなので、車輪を再発明しています。

  2. メイン スーパーバイザーの下に各ワーカーのスーパーバイザーを作成します。これは私の 2 番目の問題を正確に解決しますが、再起動後にワーカーの状態が失われるため、ワーカーの状態を格納する ets テーブルのようなストレージが必要です。

私は Erlang に非常に慣れていないので、(もしあれば) どの解決策が最適かについて、私の問題に対するアドバイスが必要です。前もって感謝します。

0 投票する
1 に答える
673 参照

erlang - スーパーバイザーは、アトミック操作として複数の子を開始します

アトミックな方法で複数のスーパーバイザーの子を開始する必要があります。つまり、グループ内の子の1つが起動時に失敗した場合、どの子も起動しないでください。

私はこの操作を関数として見ています:

これを適切な方法で実装するにはどうすればよいですか?例、ライブラリなどはありますか?私の直感によると、リストからすべての子を開始し、すべてが成功したかどうかを確認してから、残りの子を殺すのは方法ではありません。

それとも、私のデザインに欠陥があり、本当にそのようなことをする必要はないのでしょうか?

0 投票する
1 に答える
160 参照

debugging - Erlang で関数呼び出しをトレースするには?

my_sup.erl に次のような関数があります。

しかし、ems_media.erl に start_link/1 という名前の関数がありません。実行時にエラーが発生しない理由を知りたいです。

では、init([ems_media_sup]) を呼び出した後、次に何が起こったかを知る方法

0 投票する
1 に答える
623 参照

erlang - simple_one_for_one の子が起動できません

simple_one_for_one スーパーバイザーをテストするコードをいくつか書きますが、動作しません。コードは次のとおりです。

私が走るとき

test_simple_one_for_one:start_link().

erl シェルでは、次のエラーが表示されます。

test_simple_one_for_one:start_fun_test(). ** 例外終了: 関数 gen_server:call/3 の {noproc,{gen_server,call, [test_simple_one_for_one,{start_child,[]},infinity]}} (gen_server.erl、188 行目)

0 投票する
1 に答える
513 参照

erlang - ibrowseを処理するためのerlangスーパーバイザーの最良の方法:send_reqconn_failed

アーランは初めてで、新しいパラダイムに頭を悩ませるのに少し苦労しています!

OK、それで私はOTPgen_server内にこの内部関数を持っています:

接続が失敗した場合の処理​​を省略した場合、終了シグナルがスーパーバイザーに伝播され、サーバーとともにシャットダウンされます。

私がしたいこと(少なくともこれが私がしたいことだと思います)は、接続障害時に一時停止してからsend_reqを10回再試行すると、その時点でスーパーバイザーが失敗する可能性があることです。

私がこのような醜いことをしたら...

サーバープロセスをシャットダウンし、はい、失敗するまで(10秒以内に10回試行)再起動戦略を使用できます。これも望ましい結果ですが、サーバーからスーパーバイザーへの戻り値は「ok」です。本当に{error、error_but_please_dont_fall_over_mr_supervisor}を返したいです。

このシナリオでは、プロセスを停止させてからスーパーバイザーに再起動させて再試行するのではなく、「my_func」内で失敗した接続を再試行するなど、すべてのビジネスを処理することになっていると強く思います。

質問:このシナリオでの「Erlangの方法」とは何ですか?

0 投票する
1 に答える
2079 参照

erlang - eshell からスーパーバイザを起動しようとすると、スーパーバイザがクラッシュしますか?

私はOTPに非常に慣れていません。スーパーバイザーの動作を理解するための簡単な例を作成しようとしています:

これが単純なインクリメントサーバーです

そして、このモジュールによって監視されるようにしたいと思います:

その後、次の手順を erlang シェルで実行しました。

この後、次に試しました(予想どおり、エラーが発生しました):

この後、私は期待していました-私のスーパーバイザーが再起動しinc_servます。しかし、それはしませんでした:

何が起こったのか理解するのを手伝ってくれませんか? そして、再起動できるようにするには、スーパーバイザーをどのように書き直すべきですかinc_serv

ありがとう