c# - TPL 并行度启发式

标签 c# .net parallel-processing task-parallel-library parallel.foreach

Parallel.ForEachThreadPool 上工作,默认情况下 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/

相关文章:

bash - 如何将引用的参数传递给 GNU Parallel

linux - 使用 bash '&' 命令并行处理

c# - 错误 : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel

c# - 如何在 Refit 中禁用 urlencoding get-params?

c# - 为什么加载包含值类型字段的类会强制 CLR 加载该值类型?

.net - 如何模拟(使用最小起订量)Unity 方法

python - cython.parallel.prange 中的 cython 共享内存 - block

c# - 如何获取最新(最后修改)的目录[C#]

c# - Xamarin Forms ListView IOS 中交替行颜色

c# - 使用 Google Drive API 下载文件