Hopac允许将give
值同步到一个通道,如果没有人在听,它将阻塞,如果没有send
读取,则异步将缓冲这些值。
我想做一些介于两者之间的事情:如果有侦听器,则给出一个值,或者如果没有侦听器,则继续进行而不阻塞或缓冲该值。有没有办法做到这一点?
Hopac允许将give
值同步到一个通道,如果没有人在听,它将阻塞,如果没有send
读取,则异步将缓冲这些值。
我想做一些介于两者之间的事情:如果有侦听器,则给出一个值,或者如果没有侦听器,则继续进行而不阻塞或缓冲该值。有没有办法做到这一点?
您可以使用Hopac的替代机制实现轮询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 库直接提供 轮询操作。也可以在 Hopac 中将轮询操作实现为优化的原语。
更新:我已将轮询或非阻塞give
以及take
操作作为同步通道上的优化原语添加到 Hopac。它们由Ch.Try模块提供。