Parallel.ForEach
在 ThreadPool
上工作,默认情况下 TPL 设置线程数,以便它根据一些内部规则实现最佳性能。但是 .NET 是否考虑了并行或嵌套的 Parallel.Foreach
调用?
例如,假设 .NET 决定对于当前环境 10 线程是最佳选择,我们有:
Parallel.ForEach(collection1, (o1) => {Parallel.ForEach(collection2, (o2) => {...}})
它会产生10*10个线程吗?
article我现在发现让我觉得线程调度的“内部规则”是如此先进和动态,它可以合理地处理所描述的情况。
最佳答案
它产生的不是线程,而是任务。这两个循环将 indirectly cooperate .这种合作并不完美,可能会导致比必要/最佳任务更多的任务排队。每个循环保持一个副本排队到调度程序。这允许调度程序启动比最佳任务更多的任务。
无论如何,这并不意味着 100 个线程在争夺 OS 资源。线程池是用来处理超额订阅的。不过,它往往会产生比 CPU 更多的线程,以便能够处理阻塞。
尽量避免嵌套循环。通常,一次最好只有一个并行循环。例如,您可以这样做:
var items =
from o1 in collection1
from o2 in collection2
select new { o1, o2 };
Parallel.ForEach(items, ...);
如果您的架构需要嵌套循环,您可以使用它们。
关于c# - TPL 并行度启发式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26547296/