问题标签 [mailboxprocessor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
736 浏览

f# - 在远程邮箱处理器之间传递消息?

我正在使用MailboxProcessor类来保持单独的代理做自己的事情。通常代理可以在同一个进程中相互通信,但我希望代理在不同进程甚至不同机器上时能够相互通信。什么样的机制最适合实现它们之间的通信?有一些标准的解决方案吗?

请注意,我正在使用 Ubuntu 实例来运行代理。

0 投票
3 回答
872 浏览

concurrency - 如何在 F# 中正确使用 TryScan

我试图找到一个有关如何使用的示例TryScan,但没有找到任何示例,您能帮帮我吗?

我想做的(非常简单的例子):我有一个MailboxProcessor接受两种类型的消息。

  • 第一个GetState返回当前状态。 GetState消息发送相当频繁

  • 另一个UpdateState非常昂贵(耗时) - 例如从互联网下载一些东西,然后相应地更新状态。 UpdateState很少被调用。

我的问题是 - 消息GetState被阻止并等到前面UpdateState的服务。这就是为什么我试图用它TryScan来处理所有GetState消息,但没有运气。

我的示例代码:

如果您尝试运行代码,您会看到该GetState消息几乎没有被处理,因为它正在等待结果。另一方面UpdateState只是即发即弃,从而有效地阻止了获取状态。

编辑

目前对我有用的解决方案是这个:


对评论的反应:与 otherMailboxProcessor或并行ThreadPool执行的想法UpdateState很棒,但我目前不需要它。我想做的就是处理所有GetState消息,然后处理其他消息。我不在乎在处理过程UpdateState中代理被阻止。

我会告诉你输出的问题是什么:

0 投票
1 回答
252 浏览

f# - 为什么这个 F# 代码在与 MailboxProcessor 一起使用时不会生成预期的输出?

我正在阅读 Don Syme 的一篇博文Async and Parallel Design Patterns in F#: Agents。但是,以下看似极其简单的代码并没有按预期生成输出。

而不是预期的 10,000 条消息,我在 Ubuntu 下使用 Mono 2.8.1 只收到大约 3000 条消息,或者在 Windows XP 下使用 Visual F# 得到 15 条消息。我在这里错过了什么吗?顺便说一句,我尝试用以下文件操作替换 printfn 语句,并得到相同的部分结果。

0 投票
2 回答
3686 浏览

c#-4.0 - 邮箱处理器来自 C#

您是否尝试过在 C# 中使用 T 的 MailboxProcessor?你能发布示例代码吗?

你如何开始一个新的,向它发布消息,以及你如何处理它们?

0 投票
1 回答
741 浏览

multithreading - F# MailboxProcessor 问题

我使用来自http://fssnip.net/3K的代码创建了一个控制台程序。我发现

  1. 我要在末尾添加“System.Console.ReadLine() |> ignore”以等待线程完成。是否可以告诉所有 MailBoxProcessor 都已完成并且程序可以自行退出?

  2. 我试图将测试网址“www.google.com”更改为无效的网址,并得到以下输出。能否避免“输出竞赛”?

[编辑]

使用 Tomas 的更新http://fssnip.net/65后,最后的输出/爬网仍然终止。以下是我将“limit”改为5并添加一些调试信息后程序的输出。最后一行显示截断的 URL。这是一种检测所有爬虫是否完成执行的方法吗?

我将主要代码更改为

但是,最后一个printfn "[Main] after crawl"永远不会执行,除非我在最后添加一个 Console.Readline() 。

[编辑 2]

代码在 fsi 下运行良好。但是,如果使用 fsi --use:Program.fs --exec --quiet 运行它也会有同样的问题

0 投票
4 回答
358 浏览

multithreading - 编译的控制台命令行程序不会等待所有线程完成

如果代码被编译为控制台程序或作为fsi --use:Program.fs --exec --quiet运行,一些线程将在完成之前终止。有什么方法可以等待所有线程结束?

这个问题可以描述为“存在多个MailboxProcessers时程序退出问题”。

输出示例

(注意最后一行被截断,最后一个输出函数 ( printfn "[Main] after crawl") 永远不会执行。)

代码

编辑:添加了几个System.Threading.Thread.CurrentThread.IsBackground <- false.

0 投票
2 回答
1278 浏览

concurrency - 将 Post 或 PostAndAsyncReply 与 F# 的 MailboxProcessor 一起使用?

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

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

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

更新:

我只是想到了示例PostAndAsyncReply中可能需要的原因:用于在队列已满时查找消息,因此您不希望在前一个完成之前再查找消息。BlockingQueueAgentScanGetPutGetPut

0 投票
2 回答
941 浏览

memory-leaks - Microsoft.FSharp.Control.Mailbox 中的内存泄漏?

我现在正在寻找长期运行服务(使用 F#)中的一些内存泄漏。到目前为止,我看到的唯一“奇怪”的事情如下:

  • 我在具有名为 QueueChannelCommands 的代数数据类型的子系统中使用 MailboxProcessor(或多或少一堆 Add/Get 命令 - 有些附加了 AsyncReplyChannels)
  • 当我分析服务(使用 Ants Memory Profiler)时,我看到了提到类型的数组的实例(大多数长度为 4,但正在增长) - 全部为空(null),其引用似乎由 Control.Mailbox 持有: 在此处输入图像描述

我在我的代码中看不到这种行为的任何原因(您可以在每个邮箱示例中找到您的标准代码 - 只是一个带有 alet! = receive和 a的循环以 amatch结尾return! loop()

有没有人见过这种行为,甚至知道如何处理?或者这甚至是一个(已知的)错误?

更新:数组的增长真的很奇怪 - 似乎在没有正确使用蜜蜂的情况下附加了额外的空间: 在此处输入图像描述

0 投票
1 回答
1421 浏览

f# - MailboxProcessor.PostAndReply 设计选择

看着:

我不明白为什么签名对我来说看起来如此违反直觉。我们要做的是向代理发布消息,然后等待回复。为什么我们必须给他一个奇怪的功能作为“信息”?

再次查看此 MSDN 片段:

我宁愿喜欢这样的东西:

谢谢

0 投票
1 回答
330 浏览

asynchronous - Async.TryCancelled 不适用于 Async.RunSynchronously

我尝试创建一个基于用户交互更新 UI 的代理。如果用户单击按钮,则应刷新 GUI。模型的准备需要很长时间,所以如果用户点击其他按钮,则取消准备并开始新的准备是可取的。

到目前为止我所拥有的:

CancellationTokenSource为每个请求返回一个并将其存储在一个可变变量中(x.Refresh() 是线程安全的,它在 UI 线程上调用)。如果第一次调用 Refresh(),则返回取消源。如果第二次调用 Refresh(),我会调用 Cancel,这应该会中止我通过 Async.RunSynchronously 运行的异步任务。

但是,会引发异常。我的样本的输出是

现在当我想到这一点时,这可能是有道理的,因为运行代理的线程被中断了,对吧?但是,我如何实现所需的行为?


我需要取消代理内部的异步工作流,以便代理可以继续使用新消息。为什么要使用邮箱处理器?因为保证只有一个线程在尝试创建 UI 模型,所以我节省了资源。

假设我通过从多个 Web 服务下载数据来创建 UI 模型,这就是我使用异步调用的原因。当用户更改组合并选择其他选项时,我想停止使用旧值查询 Web 服务(= 取消异步调用),并希望创建具有新值的新模型基础 od Web 服务调用。

任何我可以使用而不是我的解决方案并能解决我的问题的建议也是受欢迎的。