[英]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.