问题标签 [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.
f# - F# 3.0:System.Exception:邮箱的多个等待读者继续
我正在尝试运行一些 MailboxProcessor 测试,并且似乎邮箱 Scan() 失败并出现“System.Exception:邮箱的多个等待读者继续”。Async.Start 和 Async.StartImmediate 等会发生这种情况(Async.RunSynchronously 也不会工作,因为在初始客户之后只有一个处理器并且没有客户)。
这是演示代码,它以交互方式工作:
...运行一段时间后我得到的堆栈跟踪是:
或相同的没有线程:
events - F# 使用代理将历史事件与两个代理之间的模拟交互交错
对不起,这个问题变得如此之大。我从一个简单的问题开始。我有历史报价数据。我想模拟一个交易代理和一个订单簿代理对数据和彼此做出反应。我是否可以使用另一个代理来控制事件流,以便前两个代理没有机会比在 R/T 中更快地对事件做出反应。- 但这似乎太模糊了,所以我经历了
- 文字墙 (TL:DR)
- 两个简短的段落(没有人知道我在问什么,因为没有问题)
- 发布了我不正确的代码和更多详细信息->又太长太模糊了
但是当我看到它时,我真的只是在问“你是怎么做到的?” 这确实不是 SO 的正确格式。正如丹尼尔指出的那样,这个问题太宽泛了,最后,菲尔的提示和良好的睡眠让我想出了一个解决方案,我在下面给出了解决方案。希望其他人能从中受益。我仍然对我的方法不满意,但我认为我的 Code Review 是一个更好的发布位置。
另外,感谢 SO F# 社区没有将我微薄的代表投票给遗忘!
感谢 Phil,我得到了一个工作原型:
输出是
我想我剩下的唯一问题是使用 AsyncSeq<'T> 之类的东西将数据吸入事件管理器而不是像我现在所做的那样将其推入会更好。
f# - F# MailboxProcessor 和功能设计
如果状态被认为是函数的坏主意,为什么在使用 MailboxProcessor 时认为状态是好的?
为了扩展,我正在向某人解释函数式编程,函数如何不使用状态(函数外部没有变量 - 即相同的数据输出相同的数据)以及它带来的好处。但后来我开始考虑 MailboxProcessor 以及它使用递归在函数调用之间保持状态的方式,我不能完全调和为什么在这种情况下它是可以的。
它是保持状态最不坏的方式吗?
f# - 为什么我的 mailBoxProcessor 卡在接收方法上?
我正在使用 F# mailBoxProcessor 异步处理从多个网络端接收到的消息。
代码按预期工作,直到我在 inbox.receive() 之后添加函数调用 getTreasuryYield。
运行几秒钟后,它每次都会卡在 inbox.receive() 处。
GetTreasuryYield 是一个相当慢的方法,因为它涉及数据库和 IO 操作,但我
仍然不明白它是如何卡住的。
任何帮助将不胜感激。
f# - MailboxProcessor、Seq.map 与 Seq.iter 内的迭代处理
今天我在 MailboxProcessor 的迭代中实现一些简单处理时遇到了问题。
起初我尝试使用 Seq.map 进行迭代,但从未调用过迭代中的代码!然后我改用 Seq.iter 进行迭代,然后处理就完成了……
我感到困惑的是为什么我不能使用 Seq.map?...现在我想知道当它没有分配给任何东西时它是否会被优化?或者当你使用 Seq 时是否会发生其他奇怪的事情。在邮箱处理器中映射..?
是的,我知道 Seq.iter 更适合无论如何只返回“单位”的简单迭代。但请原谅我,我还在学习;)。
asynchronous - 邮箱处理器线程失败时的 F# 关闭
所以我在书本上进行了一些 CPU 密集型的批量计算。我建立了一个跟踪器来跟踪任务的计算。我关闭了一个邮箱处理器,它在没有并行化的情况下运行良好,但是当我放置一个 array.parallel.map 或异步工作流时,邮箱处理器失败。我想知道为什么?
asynchronous - 失败后重启MailboxProcessor?
我正在尝试通过该类开始使用 F# 中的代理,但MailboxProcessor<'Msg>
我很快意识到我没有对异常进行适当的处理。在 Haskellian 世界中,不会有任何例外,因此处理问题的正确方法是简单地将它们作为响应案例提供;因此代理可以回复如下内容:
然后可以调用代理的.PostAndReply
方法并获得InvalidData
包含指示数据无效原因的消息。但是,这不是 Haskell,有时会发生异常。所以如果我这样做:
第二次调用agent.PostAndReply
无限期阻塞。当不使用AsyncReplyChannel
并因此只是调用agent.Post
时,调用不会阻塞,但是一旦代理遇到异常,新消息就会留在队列中。在任何一种情况下重新启动代理似乎都是不可能的,因为该agent.Start
函数InvalidOperationException
在再次调用时返回一个,处理这个问题的自然方法似乎是创建一个具有干净状态的新代理,但随后所有排队的消息都丢失了。
除了将代理的整个主体包装在 中之外try..with
,还有什么好方法可以让代理在异常后继续运行?或者,是否已经建立了一种“标准”的处理方式,有人可以指出我?
f# - 如何查询 MailboxProcessor 状态?
我想要实现的是让一个代理负责操作项目的地图。那是一个简单的聚会,但现在我想知道如何在该地图上进行查询?
看看这段代码:
所以现在我想做这样的事情:
但项目计数为 0,查询不返回任何内容:(
我知道时间表的状态是不可变的,但我记得可以用新实例替换不可变的变量......
有人可以帮我解决这个问题吗?
f# - F#、MailboxProcessor 和 Async 运行缓慢?
背景。
我想弄清楚MailboxProcessor。这个想法是将它用作某种状态机并在状态之间传递参数然后退出。有些部分将进行异步通信,所以我在那里做了一个睡眠。这是一个控制台应用程序,因为主线程退出并杀死它背后的一切,所以创建 Post 什么都不做。我正在主要制作 PostAndReply。另外,我试过没有
, 没有任何区别。
问题。
(我可能做错了什么)
Go24 不是异步的。将 RunSynchronously 更改为 StartImmediate 没有明显的区别。结尾应该在 GetMe 下面的某个地方。同时在 Fetch 之后打印出 Done。控制不应该在睡眠时返回到主线程吗?
Go24, wait go24 1, end Fetch 1 Done GetMe ...
运行时间非常慢。毫不拖延地获取大约 10 秒(秒表)。我认为 F# 线程是轻量级的,应该使用线程池。根据调试器,创建每个线程需要大约 1 秒,它看起来像真正的线程。
此外,更改为 [1..100] 将“暂停”程序 100 秒,根据 ProcessExplorer,在此期间创建了 100 个线程,然后才打印所有内容。我实际上更喜欢更少的线程和缓慢的增长。
代码。
程序.fs
邮箱.fs
performance - F# Akka.NET 代理同步时的性能优化
我正在尝试解决以下问题。我有一些实时运行的代理,具有几毫秒的大心跳,因此它们处理的操作顺序大多是确定性的(因为消息处理不是瓶颈)。
现在,我正在对不再有心跳的系统进行大量模拟(否则将需要几个世纪)——但我需要确保操作顺序得以保留。为此,我采用了以下解决方案:模拟器确保每个代理都处理了他的消息队列,方法是发布一个虚拟同步消息并在等待答案时阻塞。这确实适用于我的应用程序,但它所花费的时间并不直观 - 因为单线程实现会快一个数量级(我猜 - x 100 ish - 虽然我没有测试过)。
我已经隔离了一个显示问题的小测试,甚至尝试使用另一个库 akka.net
基本上,对于仅仅 100 万次同步,两者都需要大约 10 秒 - 而不是计算所涉及的任何内容,这是......不幸的。
我想知道是否有人遇到过同样的问题,是否有任何方法可以关闭开销,强制所有内容以单线程模式运行......这比停用所有 cpu 更好,但在 bios 中只有 1 - 或在没有代理的情况下编写整个系统的克隆。
任何帮助都非常感谢。