4

Hopac允许将give值同步到一个通道,如果没有人在听,它将阻塞,如果没有send 读取,则异步将缓冲这些值。

我想做一些介于两者之间的事情:如果有侦听器,则给出一个值,或者如果没有侦听器,则继续进行而不阻塞或缓冲该值。有没有办法做到这一点?

4

1 回答 1

6

您可以使用Hopac的替代机制实现轮询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 库直接提供 轮询操作。也可以在 Hopac 中将轮询操作实现为优化的原语。

更新:我已将轮询或非阻塞give以及take操作作为同步通道上的优化原语添加到 Hopac。它们由Ch.Try模块提供。

于 2014-07-15T18:41:24.817 回答