Hopac允许将give
值同步到一个通道,该通道将在没有人正在侦听时阻塞,并允许异步send
,如果没有读取它们将缓冲这些值。< / p>
我想在中间做一些事情:如果有一个监听器就给出一个值,或者在没有阻塞或缓冲值的情况下继续进行操作(如果没有)。有办法吗?
答案 0 :(得分:5)
您可以使用Hopac的alternative mechanism实施轮询give
和take
操作。以下是此类轮询操作的可能签名:
module Ch =
module Poll =
val give: Ch<'x> -> 'x -> Job<bool>
val take: Ch<'x> -> Job<option<'x>>
以下是该签名的实现:
module Ch =
module Poll =
let give xCh x =
Alt.pick (xCh <-? x >>%? true <|> Alt.always false)
let take xCh =
Alt.pick (xCh |>>? Some <|> Alt.always None)
这些工作的方式是左侧替代方案如果可用则提交。否则,右侧的替代方案将被承诺,因为它始终可用。
请注意,只有通信的另一方在通道上等待的情况下才会有意义。如果两个结束尝试民意调查,则不太可能进行通信。
Hopac所基于的Concurrent ML库直接提供 polling operations。 也可以在Hopac中将轮询操作实现为优化的原语。
更新:我已将轮询或非阻塞,give
和take
操作作为同步通道上的优化基元添加到Hopac。它们由Ch.Try模块提供。