第三方物流并行度启发式
本文关键字:启发式 并行度 第三方 | 更新日期: 2023-09-27 18:27:51
Parallel.ForEach
在ThreadPool
上工作,默认情况下,TPL设置线程数,以便根据一些内部规则获得最佳性能。但是.NET是否考虑了并行或嵌套的Parallel.Foreach
调用?例如,假设.NET决定对于当前环境10线程是最佳选择,我们有:
Parallel.ForEach(collection1, (o1) => {Parallel.ForEach(collection2, (o2) => {...}})
它会产生10*10线程吗?
我现在发现的这篇文章让我觉得"内部规则";的线程调度是如此先进和动态,以至于它可以合理地处理所描述的情况。
它不生成线程,而是生成任务。这两个循环将间接地合作。这种合作并不完美,可能会导致排队的任务多于必要/最佳任务。每个循环保持一个复制副本排队到调度程序。这允许调度程序启动比最佳任务更多的任务。
无论如何,这并不意味着100个线程正在争夺操作系统资源。线程池是用来处理超额订阅的。不过,为了能够处理阻塞,它往往会产生比CPU更多的线程。
尽量避免嵌套循环。通常,一次只能有一个并行循环是最好的。例如,你可以这样做:
var items =
from o1 in collection1
from o2 in collection2
select new { o1, o2 };
Parallel.ForEach(items, ...);
如果您的体系结构需要嵌套循环,您可以拥有它们。