2012-02-12 77 views
4

在java中,有持有实施的BlockingQueue接口好的包java.util.concurrent中。阻塞队列执行在Haskell

我需要在Haskell类似的东西,所以这将是能够

  • 保持固定的队列的大小在内存
  • 块读取操作时,队列为空(GET)
  • 提供时间盒装块,如果队列为空超时超过
  • 类似认沽操作,这些操作将返回Nothing - 块,直到队列有能力随着时间的推移,盒装版

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

回答

3

stm-chans包中包含各种各样的用于STM信道。它似乎比上面提到的BoundedChan软件包(2009年最后一次更新)更加积极地维护,并且由于使用STM,它将是异常安全的。

我相信它的TBChan变种,与System.Timeout结合,满足您的所有需求。

7

Haskell中的并发队列通常被称为Chan(channel),正如你所期望的那样,确实a BoundedChan package on Hackage看起来确实符合你的需求,除了超时之外。但是,您应该可以通过使用System.Timeout来获得该结果。

+0

是的,这似乎不错,结合起来,与来自System.Timeout超时时间盒装块和jdevelop具有正是他问:) – Jedai 2012-02-12 11:50:53

+0

陈是否与多个生产者/消费者工作?我可以启动N个生产者,为他们提供阻塞队列,然后启动将从该队列获取数据的M个消费者? AFAIR渠道致力于单一生产者 - >单一消费者模式,这不是我的情况。 – jdevelop 2012-02-12 11:54:42

+2

Chan可以很好地与多个生产者/消费者一起工作(尽管当你从队列中读取一个元素时,它已经消失了,但我想这是不言而喻的)是什么让你认为渠道是单一生产者 - >单一消费者? (你可以利用dupChan获得广播而不是正常的行为) – Jedai 2012-02-12 11:57:37

3

我需要给出一个小警告。 BoundedChan的来源表明它不是例外安全的。如果你知道你是免费的例如你避免killThread,那么这将是好的。如果你想要一个防弹图书馆,那么你将不得不改进BoundedChan。例外安全库将使用withMVarbracket代替takeMVarputMVar

使用STM将避免最异常的安全问题,而这可以通过System.Timeout组成。另外,在Hackage上超时已被封装了几种方式。