我正在測試Microsoft Orleans作爲分佈式計算框架的可行性。它似乎可能工作,但我想知道如何設置給定筒倉中的最大活動穀物數量?微軟奧爾良每個筒倉的最大谷物
我的穀物不會純粹被CPU束縛,會執行一些IO和其他相關任務。我擔心,如果我讓它瘋狂運行,它會產生大量的事件,從而導致整個事情陷入困境。
像這樣的筒倉配置可能嗎?
我正在測試Microsoft Orleans作爲分佈式計算框架的可行性。它似乎可能工作,但我想知道如何設置給定筒倉中的最大活動穀物數量?微軟奧爾良每個筒倉的最大谷物
我的穀物不會純粹被CPU束縛,會執行一些IO和其他相關任務。我擔心,如果我讓它瘋狂運行,它會產生大量的事件,從而導致整個事情陷入困境。
像這樣的筒倉配置可能嗎?
奧爾良非常適合非CPU綁定的工作。奧爾良穀物被設計爲使用Task<T>
而不是線程,因此您應該始終使用C#的async/await功能執行異步IO。
如果您確實需要執行阻塞IO,可以將糧食SynchronizationContext
和await
結果在你的糧食之外執行的IO,像這樣:
var result = await Task.StartNew(() => {
// Perform blocking work.
return 43;
}, TaskCreationOptions.LongRunning);
提示,調度,一個新的應該使用線程。 更好的方法是創建您自己的ThreadPool
&後續TaskScheduler
該工作並將其用於您的IO。
請注意,您應該瞭解潛在的dangers of Task.StartNew。
將所有阻塞操作卸載到線程池並將MaxActiveThreads保留爲默認值(#cores)會更好。 基本上你永遠不想阻止奧爾良線程(那些MaxActiveThreads)。那些奧爾良線程應該做一個簡單的計算併發出外部異步調用(對其他穀物或外部服務)。所有重計算都不應該在Orlean的線程上完成。
你可以做到這一點,仍然保持單線程執行保證。 請參閱:http://dotnet.github.io/orleans/Advanced-Concepts/External-Tasks-and-Grains