Arb*_*bil 3 f# asynchronous hopac
Hopac允许同步give值到一个通道,该通道将在没有人正在侦听时阻塞,并且异步地send 将在没有读取时缓冲这些值.
我想在中间做一些事情:如果有一个监听器则给出一个值,或者在没有阻塞或缓冲值的情况下继续运行(如果没有).有办法吗?
小智 5
您可以使用Hopac 的替代机制实现轮询give和take操作.以下是此类轮询操作的可能签名:
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中将轮询操作实现为优化的基元.
更新:我已将同步通道上的轮询或非阻塞give和take操作作为优化基元添加到Hopac.它们由Ch.Try模块提供.