阻塞Haskell中的队列实现

时间:2012-02-12 11:38:08

标签: haskell blockingqueue

在java中,有一个很好的包java.util.concurrent,它保存了BlockingQueue接口的实现。

我在Haskell中需要类似的东西,所以它能够

  • 在内存中维护队列的固定大小
  • 当队列为空(get)时阻止读取操作
  • 提供有时间限制的块,如果队列为空且超时超时,则会返回Nothing
  • 类似于put操作 - 阻塞直到队列具有带时间框版本的容量

可能这可以通过STM或阻止交易来实现 - 但我无法在hackage上找到类似的东西。

3 个答案:

答案 0 :(得分:7)

在Haskell中,并发队列通常被称为Chan(通道),正如您所料,确实a BoundedChan package on Hackage看起来应该符合您的需求,除了超时。但是,您应该可以使用System.Timeout

来实现

答案 1 :(得分:3)

我需要发出一个小小的警告。 BoundedChan的来源表明它不是例外安全的。如果你知道你是免费的例外,例如你避免killThread,那么这将没关系。如果您想要一个防弹库,那么您将需要改进BoundedChan。异常安全库将使用withMVarbracket而不是takeMVarputMVar

使用STM可以避免大多数异常安全问题,这可以由System.Timeout组成。此外,超时已在Hackage上包含了几种方式。

答案 2 :(得分:3)

stm-chans包中包含各种STM通道。它似乎比所提到的BoundedChan软件包(最近在2009年更新)更积极地维护,并且由于它使用STM,它将是异常安全的。

我相信其TBChan变体与System.Timeout一起符合您的所有要求。