2011-09-20 9 views
8

私はN個のワーカープロセスを持つスーパーバイザを持っています。いつものように、監督者は作業者プロセスにメッセージを送ることができ、作業者からの応答を監督者に送るhandle_castがあります。Erlang supervisor:すべてのワーカーが返信したかどうかを確認する方法

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

答えて

8

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

特定の問題を解決するには、すべての作業者にメッセージを送信するプロセスが必要です。このプロセスはまた、その状態にあるすべての労働者のリストを保持し、応答した労働者を「チェックする」(またはリストから削除する)ことができる。これは、PIDのリストとプロセスからの応答を受け取って(または終了時に終了する場合はerlang:monitor/2でプロセスを監視することによって)、誰が残っているかを確認することで実現できます。

3

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

免責

私が言う「でし」それはあなたの「労働者」とは、あなたの特定のケースで何をするかに依存しているため。回答の内容に興味がある場合は、この方法を使用しない方がよいかもしれませんが、すべての作業者が作業を完了したということだけに興味がある場合 - たとえば、それらの部分的な結果をデータベースに保存するので、部分的なものを組み合わせる準備ができています.gener_eventは、移動するルートになる可能性があります。

免責 OF

ENDだから... OTPで

は、イベントマネージャは、イベントが送信可能な名前付きオブジェクトです。

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

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

基本的に、スーパーバイザと複数のワーカーを持つ代わりに、イベントマネージャと複数のイベントハンドラがあります。その後、gen_event:sync_notify/2機能を使用することができ

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

* gen_event * look herethereの詳細については、こちらをご覧ください。

関連する問題