Hopac - 只有在有人收听频道的情况下,才能为频道提供价值吗?

时间:2014-07-13 09:52:37

标签: asynchronous f# hopac

Hopac允许将give值同步到一个通道,该通道将在没有人正在侦听时阻塞,并允许异步send,如果没有读取它们将缓冲这些值。< / p>

我想在中间做一些事情:如果有一个监听器就给出一个值,或者在没有阻塞或缓冲值的情况下继续进行操作(如果没有)。有办法吗?

1 个答案:

答案 0 :(得分:5)

您可以使用Hopac的alternative mechanism实施轮询givetake操作。以下是此类轮询操作的可能签名:

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中将轮询操作实现为优化的原语。

更新:我已将轮询或非阻塞,givetake操作作为同步通道上的优化基元添加到Hopac。它们由Ch.Try模块提供。