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

Arb*_*bil 3 f# asynchronous hopac

Hopac允许同步give值到一个通道,该通道将在没有人正在侦听时阻塞,并且异步地send 将在没有读取时缓冲这些值.

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

小智 5

您可以使用Hopac 的替代机制实现轮询givetake操作.以下是此类轮询操作的可能签名:

module Ch =
  module Poll =
    val give: Ch<'x> -> 'x -> Job<bool>
    val take: Ch<'x> -> Job<option<'x>>
Run Code Online (Sandbox Code Playgroud)

以下是该签名的实现:

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)
Run Code Online (Sandbox Code Playgroud)

这些工作的方式是左侧替代方案如果可用则提交.否则,右侧的替代方案将被承诺,因为它始终可用.

请注意,只有通信的另一侧正在等待通道的情况下,这些才有意义.如果这两个端尝试轮询,沟通是不可能发生的.

Hopac所基于的Concurrent ML库直接提供 轮询操作.也可以在Hopac中将轮询操作实现为优化的基元.

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