[英]C# how do I parallellize an IEnumerable of IEnumerable?
我有一個變量:
var contexts
設置后是IEnumerable
。 這個對象的一個屬性也是我有的IEnumerable
:
Parallel.ForEach(contexts.AsParallel(), (context) =>
{
Parallel.ForEach(context, (child) =>
{
});
});
但VS抱怨第二個ForEach
你試圖在這里應用太多的嵌套並行性。
Parallel.ForEach( <-- #1
contexts.AsParallel(), <-- #2
(context) => {
Parallel.ForEach( <- #3
假設這是CPU綁定工作,你真的不想這樣做。 這可能會創建太多需要映射到線程的任務,這將導致大量適得其反的上下文切換。
假設在最外層循環中具有相等卷的足夠數量的項目,那么最好將並行性保持在外部循環:
Parallel.ForEach(
contexts,
context => { ...
(如果外環上的項目數不足以使所有內核保持忙碌,或者內部IEnumerable
的項目分散不均勻並且會導致任務在不相等的時間內完成,那么請考慮使用@TheGeneral的使用思路contexts.SelectMany(c => c)
,即外形的形式outer.SelectMany(o => o.Inner)
,在並行化之前將嵌套集合展平為一個較大的集合。
如果仍然發現並發對於CPU綁定工作而言太高,則可以將其與目標計算機上的實際核心數相匹配,例如,如果您有8個可用核心:
Parallel.ForEach(
contexts,
new ParallelOptions { MaxDegreeOfParallelism = 8 },
context => { ...
但是,如果要將其用於IO綁定工作,那么Parallel.For*
/ .AsParallel
是錯誤的工具 - 使用異步並行工具,如Task.WhenAll
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.