[英]TPL parallelism degree heuristic
Parallel.ForEach適用於ThreadPool,默認情況下,TPL設置線程數,以便根據一些內部規則實現最高性能。 但.Net是否考慮了並行或嵌套的“Parallel.Foreach”調用? 例如,假設.Net決定對於當前環境, 10個線程是最佳選擇,我們有:
Parallel.ForEach(collection1, (o1) => {Parallel.ForEach(collection2, (o2) => {...}})
它會產生10 * 10個線程嗎?
我現在發現的文章讓我覺得線程調度的“內部規則”是如此先進和動態,它可以合理地處理所描述的案例。
它不會產生線程而是產生任務。 這兩個循環將間接合作 。 這種合作並不完美,可能導致排隊的任務超過必要/最佳。 每個循環使一個副本排隊等待調度程序。 這允許調度程序啟動比最佳任務更多的任務。
在任何情況下,這並不意味着100個線程正在競爭OS資源。 線程池用於處理超額訂閱。 但是,它往往會產生比CPU更多的線程,以便能夠處理阻塞。
盡量避免嵌套循環。 通常,最好一次只有一個並行循環。 例如,你可以這樣做:
var items =
from o1 in collection1
from o2 in collection2
select new { o1, o2 };
Parallel.ForEach(items, ...);
如果您的架構需要嵌套循環,您可以擁有它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.