Concurrency 使用带有F#和#x27的Post或PostAndAsyncReply;s邮箱处理器?

Concurrency 使用带有F#和#x27的Post或PostAndAsyncReply;s邮箱处理器?,concurrency,f#,actor,mailboxprocessor,Concurrency,F#,Actor,Mailboxprocessor,我看到过不同的代码片段演示了一个Put消息,该消息使用F#的MailboxProcessor返回unit。在某些情况下,仅使用Post方法,而其他情况下使用PostAndAsyncReply,回复通道在处理消息后立即回复。在做一些测试时,我发现在等待回复时存在明显的时间延迟,因此,除非您需要真正的回复,否则应该使用Post 注意:我开始问这个问题,但我认为把它作为一个完整的问题发布是有用的。在另一个线程中,Tomas Petricek提到回复通道可以用作等待机制,以确保调用方延迟到处理Put消息

我看到过不同的代码片段演示了一个
Put
消息,该消息使用F#的
MailboxProcessor
返回
unit
。在某些情况下,仅使用
Post
方法,而其他情况下使用
PostAndAsyncReply
,回复通道在处理消息后立即回复。在做一些测试时,我发现在等待回复时存在明显的时间延迟,因此,除非您需要真正的回复,否则应该使用
Post

注意:我开始问这个问题,但我认为把它作为一个完整的问题发布是有用的。在另一个线程中,Tomas Petricek提到回复通道可以用作等待机制,以确保调用方延迟到处理
Put
消息

使用
PostAndAsyncReply
是否有助于邮件排序,或者只是强制暂停直到处理完第一封邮件?就性能而言,
Post
似乎是正确的解决方案。准确吗

更新:


我刚刚想到了在队列中可能需要
PostAndAsyncReply
的原因:
Scan
用于在队列已满时查找
Get
消息,因此,您不希望在前一个
放置
之前
放置
然后
获取

我想我大体上同意您的总结-
PostAndAsyncReply
Post
慢,这是有道理的,因此如果调用方在操作时不需要从代理获取通知(例如将值放入队列)完成后,它肯定会公开一种方法,只需使用
Post
。事实上
PostAndAsyncReply
的速度要慢得多,这可能意味着一些代理应该公开这两个选项,并让调用方决定

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

使用使用
PostAndAsyncReply
发送
Put
消息的
BlockingQueueAgent
,我们可以等待元素异步添加到队列中(因此它会阻止生产者,但不会阻止线程!)一个典型用法的例子是我不久前写的。下面是其中的一个片段:

// 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) }

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

我的建议是设计您的系统,以便尽可能多地使用
Post


这项技术是为异步并发而设计的,其目标是触发并忘记消息。等待响应的想法与此背道而驰。

这不是归结为您是否需要回复?还是我遗漏了什么?“因此,除非你需要一个真正的答复,否则你应该使用
Post
”这是你的问题吗?如果是的话,那么是的。我对你想表达的意思有点困惑。你担心的只是性能问题吗?这是来源FWIW。我对问题进行了一些更新,试图澄清。