繁体   English   中英

F#/ MailBoxProcessor在近100%的负载下对PostAndReply无响应

[英]F# / MailBoxProcessor is unresponsive to PostAndReply under nearly 100% load

我有一个MailBoxProcessor ,它执行以下操作:

  1. 主循环( type AsyncRunnerhttps : //github.com/kkkmail/RTIFSharp/blob/master/ContGen/AsyncRun.fs#L257 –行号可能会随着我不断更新代码而改变)。 它生成一些“模型”,将它们每个都编译到模型特定的文件夹中,将它们作为外部进程生成,然后每个模型使用WCF通过调用updateProgress来“通知” AsyncRunner的进度。 一个模型可能需要几天的时间才能运行。 一旦完成任何模型,跑步者就会生成/产生更多的东西。 尽管我可以指定使用较少数量的逻辑核心(介于1和Environment.ProcessorCount之间的某个数字),但它旨在在100%的处理器负载下运行(但优先级为: ProcessPriorityClass.BelowNormal )。 当前,我通过使用… |> Async.Start来“异步” MailBoxProcessor内部几乎所有内容,以确保“永不”阻塞主循环。

  2. 我可以通过调用member this.getState () = messageLoop.PostAndReply GetState来“询问”跑步者的状态(使用WCF)。

  3. 或者我可以向它发送一些命令(再次使用WCF),例如, member this.start()member this.stop() ,...

这是有趣的地方。 一切正常! 但是,如果我运行一个“监视器”,它将通过无限循环有效地调用PostAndReply (公开为PostAndReply this.getState () )来请求一个状态, PostAndReply后它就会挂起。 我的意思是说它确实最终会返回,但是会有一些无法预料的大延迟(例如几分钟)。 同时,我可以发出命令,并且它们会快速返回,而getState仍未返回。

是否可以使它在接近100%的负载下做出响应? 非常感谢!

我建议不要在主程序中异步处理任何东西(除了生成进程外),因为代码会创建其他进程。 您的主循环正在等待循环返回以继续处理GetState()方法。

暂无
暂无

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

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