scalaメールボックスのサイズ制限
質問
Scalaでアクターのメールボックスの最大サイズを設定できますか?
生産者と消費者の問題を取ります。スレッドを使用すると、バッファーがいっぱいになったときにプロデューサーをブロックできます。私はScalaで書かれたいくつかのプロデューサーとコンシューマーの例を見て、それらはすべて「バッファー」として使用されるメールボックスを持つアクターを使用します。プロデューサーがコンシューマーの準備ができるまで待機するようにメールボックスのサイズを設定できますか?メールボックスの手に負えない成長を避けるための他のエレガントなソリューションはありますか?
解決
プロデューサーとコンシューマー間のバッファーとして機能するアクターを作成できます。バッファは、そのメールボックスをループデータにチェックアウトします。 「オーバーロード」を送り返します。緩衝製品の数が多すぎる場合の生産者へのメッセージ。そして、「クリア」を送信します。すべてが正常に戻ったらメッセージを送信します。メッセージが多すぎる場合、受信メッセージ(または最も古いメッセージ)をドロップします。
消費者はバッファから製品を積極的に要求し、バッファは1つの製品を送り返します。バッファーが空の場合、コンシューマーは入力を待機し続けます。
プロデューサーは製品をバッファーアクターに送信します。 「オーバーロード」を受け取った場合製品がドロップされる可能性があることを認識して、生産を停止するか、生産を継続することができます。
もちろん、このロジックはプロデューサーまたはコンシューマー自体に直接実装できますが、別のバッファーを使用すると、複数のプロデューサーまたはコンシューマー、あるいはその両方をより簡単に導入できます。
他のヒント
Actor.mailboxSize
メソッドは、アクターのメールボックスにある保留中のメッセージの数を返します。
これは、プロデューサーをさまざまな方法で調整するために使用できます。
たとえば、1つの可能性があります
プロデューサーは、コンシューマーの mailboxSize
がしきい値よりも大きいかどうかを確認します。存在する場合、 SpecialMessage
をコンシューマに送信し、セマフォでブロックします。コンシューマはこの SpecialMessage
を受信すると、セマフォを解放します。プロデューサーはビジネスを楽しく続けることができます。
これにより、ポーリングやドロップされたメッセージが回避されます。