繁体   English   中英

使用Post或PostAndAsyncReply与F#的MailboxProcessor?

[英]Use Post or PostAndAsyncReply with F#'s MailboxProcessor?

我已经看到了不同的片段展示了一个Put返回消息unit与F#的MailboxProcessor 在某些情况下,只使用Post方法,而其他人使用PostAndAsyncReply ,一旦处理消息,回复通道立即回复。 在做一些测试时,我发现在等待回复时有很长的时间滞后,所以看起来除非你需要真正的回复,否则你应该使用Post

注意:我开始在另一个帖子中询问这个问题,但认为发布完整问题很有用。 在另一个帖子中,Tomas Petricek提到回复通道可以使用等待机制来确保调用者延迟直到Put消息被处理。

使用PostAndAsyncReply是否有助于消息排序,还是只是强制暂停直到处理第一条消息? 在性能方面, Post出现了正确的解决方案。 那是准确的吗?

更新:

我刚刚想到了为什么在BlockingQueueAgent示例中可能需要PostAndAsyncReply的原因:当队列已满时, Scan用于查找Get消息,因此您不希望在前一个Put完成之前先Put然后Get

我的建议是设计你的系统,这样你就可以尽可能地使用Post

该技术专为异步并发而设计,其目标是发送即发消息。 等待回应的想法直接违背了这一点。

我认为我通常同意你的摘要 - PostAndAsyncReplyPost慢,所以如果调用者在操作(例如将值放入队列)完成时不需要从代理获得通知,那么它应该是肯定会使用Post一种方法。 PostAndAsyncReply慢得多的事实可能意味着某些代理应公开这两个选项并让调用者决定。

关于BlockingQueueAgent (或者我用来实现单位缓冲区的类似例子)的具体示例,代理的典型应用是解决消费者 - 生产者问题。 在消费者 - 生产者问题中,我们希望在队列满时阻止生产者,并在消费者为空时阻止消费者。 .NET BlockingCollection仅支持同步阻塞,这有点不好(即它可以阻塞整个线程池)。

在使用BlockingQueueAgent发送该Put使用讯息话题PostAndAsyncReply ,我们可以等到元素被添加到队列异步(所以它会阻止生产国,但不阻塞线程!)典型应用的一个例子是图像处理流水线 ,我写的前一段时间。 这是一个片段:

// Phase 2: Scale to a thumbnail size and add frame
let scalePipelinedImages = async {
   while true do 
     let! info = loadedImages.AsyncGet()
     scaleImage info
     do! scaledImages.AsyncAdd(info) }

此循环重复从loadedImages队列中获取图像,执行一些处理并将结果写入scaledImages 使用队列的阻塞(在读取和写入时)都控制并行性,因此管道的步骤并行运行,但如果管道无法以所需的速度处理它们,则不会继续加载越来越多的图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM