8

N人のワーカープロセスを持つスーパーバイザーがいます。いつものように、スーパーバイザーはワーカープロセスにメッセージを送信できhandle_cast、ワーカーからスーパーバイザーに応答を送信するがあります。

N人の労働者全員が上司に返信したことを正確に確認するにはどうすればよいですか?あらゆる種類のイベント処理でこれを実装することは可能ですか?つまり、ある種のETSで、スーパーバイザーに「OK、全員が応答しました」と伝え、スーパーバイザーに「すべてのNプロセスが応答しました」ステータスを毎秒チェックさせないようにすることは可能ですか。子レジストリテーブル?

4

2 に答える 2

8

OTP について話している場合、それからsupervisorワーカーにメッセージを送信することはできません。スーパーバイザは、プロセスの開始監視再起動、および停止を目的とした、非常に制限された動作です。他には何もありません。

したがって、特定の問題を解決するには、すべてのワーカーにメッセージを送信するプロセスが必要です。このプロセスは、すべてのワーカーのリストをその状態で保持することもでき、応答したワーカーを「チェックオフ」(またはリストから削除) します。これは、PID のリストを使用してプロセスからの応答を受け取り (またはプロセスerlang:monitor/2が完了したときにプロセスが終了しているかどうかを監視することで)、誰が残っているかを確認することで実現できます。

于 2011-09-20T08:52:35.200 に答える
3

別の方法-あなたのケースに適用できる(または適用できない)のは、gen_event動作を使用することです。

免責事項

私が「できた」と言うのは、それはあなたの「労働者」があなたの特定のケースで何をするかによるからです。返信の内容に関心がある場合は、このアプローチを使用しない方がよいかもしれませんが、すべてのワーカーがタスクを完了したという事実だけに関心がある場合 (たとえば、ワーカー プロセスが重い計算を行う場合)部分的な結果をデータベースに保存すると、部分的なものを結合する準備が整います - gen_event が行くべきルートになる可能性があります。

免責事項の終わり

そう...

OTP では、イベント マネージャは、イベントの送信先となる名前付きオブジェクトです。

イベントはメッセージです。

イベント マネージャには、ゼロ、1 つ、または複数のイベント ハンドラがインストールされます。イベント マネージャーがイベントについて通知されると、そのイベントは、インストールされているすべてのイベント ハンドラーによって処理されます。

したがって、基本的には、1 つのスーパーバイザーと複数のワーカーを使用する代わりに、イベント マネージャーと複数のイベント ハンドラーを使用します。

次に、 gen_event:sync_notify/2関数を使用できます。

sync_notify は、イベントがすべてのイベント ハンドラによって処理された後に ok を返すという意味で同期的です。

*gen_event* の詳細については、ここそこを参照してください。

于 2011-09-22T13:15:56.213 に答える