2012-02-12 18 views
4

Javaでは、BlockingQueueインタフェースの実装を保持する素敵なパッケージjava.util.concurrentがあります。キューが空の場合 Haskellでのブロックキューの実装

  • ブロックは、読み取り操作

    それは

    • にできるようになるので、私は、Haskellの中に似た何かを必要とするが、メモリ内のキューの固定サイズを維持(取得)
    • 時間箱入りを提供キューが空でタイムアウトを超えた場合にNothingを返します。
    • put操作に似ています - キューにタイムボックス付きの容量があるまでのブロック

    これはおそらくSTMやトランザクションをブロックして実装することができますが、hackageのようなものは見つけられませんでした。

  • 答えて

    3

    stm-chansパッケージには、STM用のさまざまなチャネルが含まれています。これは、BoundedChanパッケージのhammar(2009年に最後に更新された)よりも積極的に維持されているようで、STMの使用により、例外的な安全性が保証されます。

    私はそのTBChanバリアントをSystem.Timeoutと一緒に考えて、あなたのすべての要件を満たしています。

    7

    同時キューは、HaskellでChan(チャネル)と呼ばれることがよくあります。期待通りに、実際にはa BoundedChan package on Hackageがあります。しかし、あなたはSystem.Timeoutを使ってそれを得ることができるはずです。

    +0

    はい、それはタイムアウトブロックのSystem.Timeoutからのタイムアウトと組み合わせて、jdevelopは彼が求めたものと全く同じです:) – Jedai

    +0

    Chanは複数のプロデューサ/コンシューマで動作しますか? N個のプロデューサを開始し、それらをブロッキングキューに供給してから、そのキューからデータを取得するM個のコンシューマを開始できますか? AFAIRチャンネルは、単一のプロデューサ - >単一の消費者モデル専用ですが、これは私の場合ではありません。 – jdevelop

    +2

    Chanは、複数のプロデューサ/コンシューマと完全にうまく動作します(ただし、キューから要素を読み込むと、その要素はなくなりますが、言うことはありません)。 (通常の動作の代わりにdupChanを使用してブロードキャストを取得することができます) – Jedai

    3

    小さな警告をする必要があります。 BoundedChanの出所は、それが例外的な安全ではないことを示している。あなたが例外がないことを知っているならば、例えばkillThreadを避けるなら、これは大丈夫でしょう。防弾ライブラリーが必要な場合は、BoundedChanに改善する必要があります。例外セーフライブラリはtakeMVarputMVarの代わりにwithMVarまたはbracketを使用します。

    STMを使用すると、例外の安全性の問題のほとんどが回避されますが、これはSystem.Timeoutで構成できます。また、タイムアウトは、Hackageにいくつかの方法でラップされています。

    関連する問題