15

Scalaでアクターのメールボックスの最大サイズを設定できますか?

生産者/消費者問題を取り上げます。スレッドを使用すると、バッファーがいっぱいになったときにプロデューサーをブロックできます。Scalaで書かれたプロデューサーとコンシューマーの例をいくつか見ましたが、それらはすべて、メールボックスを「バッファー」として使用するアクターを使用しています。メールボックスのサイズを設定して、プロデューサーがコンシューマーの準備ができるまで待機するようにできますか?メールボックスの制御不能な増加を回避するための他のエレガントなソリューションはありますか?

4

2 に答える 2

16

プロデューサーとコンシューマーの間のバッファーとして機能するアクターを作成できます。バッファは、メールボックスをループデータにチェックアウトします。バッファリングされた製品の数が多すぎる場合、プロデューサーに「オーバーロード」メッセージを送り返します。すべてが正常に戻ったら、「クリア」メッセージを送信します。メッセージが多すぎる場合は、着信メッセージ(または最も古いメッセージ)をドロップするだけです。

消費者はバッファから製品を積極的に要求し、バッファは1つの製品を送り返します。バッファが空の場合、コンシューマは入力を待ち続けます。

プロデューサーは製品をバッファーアクターに送信します。「過負荷」メッセージを受信した場合、製品がドロップされる可能性があることを認識して、生産を停止するか、生産を継続することができます。

もちろん、このロジックはプロデューサーまたはコンシューマー自体に直接実装できますが、個別のバッファーを使用すると、複数のプロデューサーやコンシューマーをより簡単に導入できます。

于 2009-10-24T10:45:10.820 に答える
5

このActor.mailboxSizeメソッドは、アクターのメールボックス内の保留中のメッセージの数を返します。

これは、さまざまな方法でプロデューサーを絞るために使用できます。

たとえば、1つの可能性は次のようになります。

プロデューサーは、コンシューマーのmailboxSizeしきい値がしきい値より大きいかどうかを確認します。SpecialMessageそうである場合は、をコンシューマーに送信し、セマフォをブロックします。消費者がこれを受け取るSpecialMessageと、セマフォを解放します。これで、プロデューサーは楽しくビジネスを続けることができます。

これにより、ポーリングやドロップされたメッセージが回避されます。

于 2009-10-25T07:29:38.980 に答える