5

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

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

  • 在内存中保持固定大小的队列
  • 队列为空时阻止读取操作(获取)
  • 提供时间框块,如果队列为空且超时,则将返回 Nothing
  • 类似于 put 操作 - 阻塞直到队列具有时间盒版本的容量

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

4

3 回答 3

7

并发队列在 Haskell 中通常称为Chan(通道),正如您所料,Hackage 上确实有一个 BoundedChan 包,它看起来应该满足您的需求,除了超时。但是,您应该能够通过使用System.Timeout来获得它。

于 2012-02-12T11:45:44.607 回答
3

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

我相信它的TBChan变体与 结合使用System.Timeout,可以满足您的所有要求。

于 2012-02-12T18:37:56.723 回答
3

我需要给出一个小小的警告。BoundedChan的来源表明它不是异常安全的。如果您知道您没有异常,例如您避免使用 killThread,那么这将是可以的。如果你想要一个防弹库,那么你将不得不改进BoundedChan。异常安全库将使用withMVarorbracket代替takeMVarand putMVar

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

于 2012-02-12T15:58:30.650 回答