Dot-Net

TPL Parallel.For 具有長時間執行的任務

  • November 25, 2012

我想使用 F# 中的任務並行庫 (TPL) 來執行許多 (>1000) 長時間執行的任務。這是我目前的程式碼:

Parallel.For(1, numberOfSets, fun j ->
   //Long running task here
   )

當我開始這個時,似乎 .NET 會立即啟動所有任務並不斷在它們之間反彈。更好的是,如果它一直執行一項任務,直到它完成,然後再進行下一個任務。這將最小化上下文切換。

有沒有辦法向調度程序提供提示?我知道可以提供提示,但我找不到明確的範例,或者調度程序是否已經對此很聰明,這只是我的看法,即發生了太多的上下文切換。謝謝您的幫助!

我們遇到了類似的問題 - 使用 C# 而不是 F#,但庫是相同的。解決方案是限制並行度:

ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = 16;
Parallel.For(0, n, parallelOptions, i => {
  . . . 
});

16 對我們的任務很有效——你應該嘗試看看哪個值更適合你的情況。

根據我的經驗,對於大量任務,最好MaxDegreeOfParallelism線性綁定到Environment.ProcessorCount.

這是與@Mimo 的 F# 語法類似的程式碼片段:

let options = ParallelOptions()
options.MaxDegreeOfParallelism <- Environment.ProcessorCount * 2

Parallel.For(0, n, options, 
            (fun i -> (* Long running task here *))) |> ignore

由於您正在使用 F# 進行並行程式,請查看優秀的書籍“使用 Microsoft .NET 進行並行程式”,尤其是“並行循環”一章。@Tomas 已將其範例翻譯為 F#,可在此處獲得。

引用自:https://stackoverflow.com/questions/13544417