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



我有一个MailBoxProcessor,它做以下事情:

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

  2. 我可以通过调用member this.getState () = messageLoop.PostAndReply GetState来"询问"运行程序(使用WCF)的状态。

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

这里是它变得有趣的地方。一切正常!然而,如果我运行一个"监视器",它会通过在无限循环中有效地调用PostAndReply(公开为this.getState ())来请求状态,那么过一段时间就会挂断。我的意思是,它确实最终会返回,但会有一些不可预测的大延迟(比如几分钟)。同时,我可以发出命令,它们会很快返回,而getState仍然没有返回。

有可能使其在接近100%的负载下做出响应吗?非常感谢!

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

相关内容

  • 没有找到相关文章

最新更新