在 java 中,有一个很好的包 java.util.concurrent 包含 BlockingQueue 接口的实现。
我在 Haskell 中需要类似的东西,所以它能够
- 在内存中保持固定大小的队列
- 队列为空时阻止读取操作(获取)
- 提供时间框块,如果队列为空且超时,则将返回 Nothing
- 类似于 put 操作 - 阻塞直到队列具有时间盒版本的容量
可能这可以通过 STM 或阻塞事务来实现 - 但我无法在 hackage 上找到类似的东西。
在 java 中,有一个很好的包 java.util.concurrent 包含 BlockingQueue 接口的实现。
我在 Haskell 中需要类似的东西,所以它能够
可能这可以通过 STM 或阻塞事务来实现 - 但我无法在 hackage 上找到类似的东西。
并发队列在 Haskell 中通常称为Chan
(通道),正如您所料,Hackage 上确实有一个 BoundedChan 包,它看起来应该满足您的需求,除了超时。但是,您应该能够通过使用System.Timeout来获得它。
stm-chans包包含多种 STM 通道。它似乎比提到的 BoundedChan 包 hammar 更积极地维护(最后一次更新是在 2009 年),并且由于它使用 STM,它将是异常安全的。
我相信它的TBChan
变体与 结合使用System.Timeout
,可以满足您的所有要求。
我需要给出一个小小的警告。BoundedChan的来源表明它不是异常安全的。如果您知道您没有异常,例如您避免使用 killThread,那么这将是可以的。如果你想要一个防弹库,那么你将不得不改进BoundedChan。异常安全库将使用withMVar
orbracket
代替takeMVar
and putMVar
。
使用 STM 可以避免大多数异常安全问题,这可以由System.Timeout组成。此外,超时已在Hackage上进行了几种包装。