Dot-Net
TPL Parallel.For 具有長時間執行的任務
我想使用 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#,可在此處獲得。