簡體   English   中英

TPL並行度啟發式

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM