簡體   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