[英]F# / MailBoxProcessor is unresponsive to PostAndReply under nearly 100% load
我有一个MailBoxProcessor
,它执行以下操作:
主循环( type AsyncRunner
: https : //github.com/kkkmail/RTIFSharp/blob/master/ContGen/AsyncRun.fs#L257 –行号可能会随着我不断更新代码而改变)。 它生成一些“模型”,将它们每个都编译到模型特定的文件夹中,将它们作为外部进程生成,然后每个模型使用WCF通过调用updateProgress
来“通知” AsyncRunner
的进度。 一个模型可能需要几天的时间才能运行。 一旦完成任何模型,跑步者就会生成/产生更多的东西。 尽管我可以指定使用较少数量的逻辑核心(介于1和Environment.ProcessorCount
之间的某个数字),但它旨在在100%的处理器负载下运行(但优先级为: ProcessPriorityClass.BelowNormal
)。 当前,我通过使用… |> Async.Start
来“异步” MailBoxProcessor
内部几乎所有内容,以确保“永不”阻塞主循环。
我可以通过调用member this.getState () = messageLoop.PostAndReply GetState
来“询问”跑步者的状态(使用WCF)。
或者我可以向它发送一些命令(再次使用WCF),例如, member this.start()
, member this.stop()
,...
这是有趣的地方。 一切正常! 但是,如果我运行一个“监视器”,它将通过无限循环有效地调用PostAndReply
(公开为PostAndReply
this.getState ()
)来请求一个状态, PostAndReply
后它就会挂起。 我的意思是说它确实最终会返回,但是会有一些无法预料的大延迟(例如几分钟)。 同时,我可以发出命令,并且它们会快速返回,而getState
仍未返回。
是否可以使它在接近100%的负载下做出响应? 非常感谢!
我建议不要在主程序中异步处理任何东西(除了生成进程外),因为代码会创建其他进程。 您的主循环正在等待循环返回以继续处理GetState()方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.