問題タブ [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.
erlang - 監督者の行動
スーパーバイザーを実装するとき..スーパーバイザーモジュールで、次のようなことをすると
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}.
関数が正常に終了した場合でも機能します。誰かが理由を説明できますか?
process - スーパーバイザーの子とプレーンな spawn_link
「monitor_node」と呼ばれるプロセスの階層があります。これらの各 monitor_nodes は、1 つのスーパーバイザによって監視されます。
さて、これらのノードのそれぞれは、複雑な内部構造を持つ場合があります。つまり、適切に動作するために必要ないくつかのサブプロセスがある場合とない場合があります。例: keep-alive メッセージを送信するプロセス。これまでのところ、プレーンな spawn_link を使用してこれらの「内部」プロセスを作成してきました。
しかし、monitor_node (監視されている) の init 関数でそれらを生成すると、この関数が失敗することがあります (したがって、スーパーバイザー ツリー全体が失敗します)。私の質問は、これらの内部プロセスをスーパーバイザー ツリーに接続することは良い解決策でしょうか? monitor_node を内部プロセスを監視するスーパーバイザーに変更することを考えています。
私の疑問は次のとおりです。
非常に多くの非常に小さなプロセスを監視する必要があります。これが良い習慣かどうかはわかりません。
特定の「内部」プロセスが単純なプロセスであるか、何らかの内部構造を持っている(他のプロセスも生成する)ことを事前に知らない場合があります。後者の場合は、おそらくこれらの「内部内部」プロセスをスーパーバイザー ツリーにアタッチする必要があります。
あまり混乱していないことを願っています。答えを楽しみにしています。
編集:
非常によく似た(同じではないにしても)問題がここで議論されています(3番目の投稿)。与えられた解決策は、I GIVE CRAP ANSWERS が与えたものとほとんど同じです。
erlang - gen_fsmの終了を処理する方法
gen_fsm動作の実装を生成するMAINプロセスがありますが、このMAINプロセスはスーパーバイザー動作の実装ではなく、単なる別のモジュールです。gen_fsmの実装がGAME_ROOMと呼ばれているとしましょう。私の場合は次のようになります。
- 3人の準備ができたら、MAINプロセスは新しいGAME_ROOMを生成します。
- gen_fsm:start_link関数を使用して新しいGAME_ROOMを開始します。そのため、GAME_ROOMがエラーで終了した場合、メインプロセスが新しいプロセスを生成して、ダウンしたプロセスを置き換えることができます。
- ダウンしたすべてのGAME_ROOMのEXITイベントをMAINプロセスで検出することができました。
問題は次のとおりです。ダウンしたすべてのGAME_ROOM状態を新しい状態に復元する必要があります。私の質問は、gen_fsmのterminate関数を使用してgen_fsmの最新の状態をMAINプロセスに渡すにはどうすればよいので、新しいGAME_ROOMをリスポーンするときに、その状態を渡すことができますか?
erlang - gen_server は起動していますか?
gen_server に「スーパーバイザーがすべての gen_servers を初期化しました。メッセージを送信できるようになりました」と伝える方法はありますか?
監視ツリー内の他の gen_servers の状態を設定する仕事をしているワーカー gen_server がいます。構成サーバーの init 関数でメッセージの送信を開始すると、{noproc, _} になることがあります。これは、構成サーバーが速すぎたことを意味していると思います。スーパーバイザーがすべてのワーカーを開始するのに十分な時間がある前に、彼はメッセージを送信しました。config_server:init() に timer:sleep(500) を配置することでこれを修正しました。これにより、すべての gen_server が初期化するのに十分な時間が確保されますが、これは洗練されていないソリューションのように思えます。
これを行う適切な方法はありますか?
erlang - simple_one_for_oneワーカーに関する情報の収集
私には、たくさんの_one_for_oneワーカーを開始するスーパーバイザー(アリスと呼ばれる)がいます。それでは、すべての作品について一緒に情報を入手したいと思います。たとえば、ワーカーがTCPサーバーであり、ワーカーが使用するすべてのポート番号、またはそれらのワーカーに接続されているすべてのリモートアドレスを取得したいとします。この機能はどこに置くべきですか?
スーパーバイザーにはgen_server機能がなく、呼び出しに応答できません。したがって、私には、最も合理的な方法は、スーパーバイザーアリスを生成する別のスーパーバイザー(bobと呼ばれる)と、supervisor:which_children(alice)を呼び出してから要求することにより、{get、ports_used_by_alices_workers}などの呼び出しを実装する別のgen_server(charile)を用意することです。ポートの各アリスの子。つまり、charileはアリスの兄弟であり、アリスの子供に関する電話に応答します。それは大丈夫ですか?または、これを行うためのよりエレガントな方法はありますか?
erlang - Erlang スーパーバイザ - 共有プロセス メールボックス
2 つの子プロセスを監視するスーパーバイザー プロセスがあります。プライマリ プロセスとバックアップ プロセス (プライマリ プロセスが終了した場合)。
メールボックスにメッセージが残っている間にプライマリ プロセスがダウンした場合、元のプライマリ プロセス メールボックスに残っていたメッセージをバックアップ プロセスが引き継いで処理する方法はありますか?
erlang - Erlangスーパーバイザー:すべてのワーカーが返信したかどうかを確認する方法
N人のワーカープロセスを持つスーパーバイザーがいます。いつものように、スーパーバイザーはワーカープロセスにメッセージを送信できhandle_cast
、ワーカーからスーパーバイザーに応答を送信するがあります。
N人の労働者全員が上司に返信したことを正確に確認するにはどうすればよいですか?あらゆる種類のイベント処理でこれを実装することは可能ですか?つまり、ある種のETSで、スーパーバイザーに「OK、全員が応答しました」と伝え、スーパーバイザーに「すべてのNプロセスが応答しました」ステータスを毎秒チェックさせないようにすることは可能ですか。子レジストリテーブル?
erlang - ErlangOTPスーパーバイザー
私はErlangプログラミングの本の演習12-2に取り組んでいます。OTPgen_serverの動作を実装するモジュールdb_server_otpがあります。スタンドアロンモジュールとして、私はそれをテストしました、そしてそれは期待通りに動作します。そのためのスーパーバイザーを追加する必要があります。この章の例に基づいて、次のようにモジュールdb_server_supを作成しました。
両方のモジュールは同じディレクトリにあり、.beamファイルを使用して両方のモジュールをコンパイルしました。erlangシェルを起動するのと同じ作業ディレクトリにあります。しかし、erlangシェルではスーパーバイザーを起動できません。
db_server_otpモジュールをインポートする必要がありますか?もしそうなら、どの関数をインポートする必要がありますか?私はすべてのOTPメソッドをdb_server_otpにエクスポートしています: