Parallel.For(Foreach) 将创建多少个线程?默认 MaxDegreeOfParallelism?

Posted

技术标签:

【中文标题】Parallel.For(Foreach) 将创建多少个线程?默认 MaxDegreeOfParallelism?【英文标题】:How many threads Parallel.For(Foreach) will create? Default MaxDegreeOfParallelism? 【发布时间】:2013-09-27 10:21:33 【问题描述】:

我想知道,当我运行 Parallel.For/ForEach 循环时将使用多少个线程。

我发现,它可以通过 MaxDegreeOfParallelism 选项进行更改。

MSDN 上的 MaxDegreeOfParallelism 帮助说 (link):

默认情况下,For 和 ForEach 将使用多少线程 底层调度程序提供,因此将 MaxDegreeOfParallelism 从 默认只限制将使用多少并发任务。

但我不知道底层调度程序提供了多少线程。

我怎样才能知道呢?

我可以使用循环运行 9999999 来测试它,但是这个测试会显示数字,而不是确定该数字的规则。

稍后编辑/添加:

我搜索了“sheduler max concurrency”,发现(在 MSDN - link),TashSheduler 类具有 MaximumConcurrencyLevel 属性,并且:

返回一个表示最大并发级别的整数。这 默认调度程序返回 Int32.MaxValue。

TaskSheduler 类被用作这些并行循环的“底层调度程序”?

【问题讨论】:

有趣的是,它返回常量2147483647.. 而不是int32.MaxValue 【参考方案1】:

根据MSDN:

Task Parallel Library 和 PLINQ 的默认调度程序使用 .NET Framework ThreadPool 来排队和执行工作。在 .NET Framework 4 中,ThreadPool 使用由 System.Threading.Tasks.Task 类型提供的信息来有效地支持并行任务和查询通常代表的细粒度并行性(短期工作单元)。

看着ThreadPool的documentation,它说:

每个进程有一个线程池。从 .NET Framework 4 开始,进程的线程池的默认大小取决于几个因素,例如虚拟地址空间的大小。进程可以调用GetMaxThreads 方法来确定线程数。可以使用SetMaxThreads方法更改线程池中的线程数。

【讨论】:

以上是关于Parallel.For(Foreach) 将创建多少个线程?默认 MaxDegreeOfParallelism?的主要内容,如果未能解决你的问题,请参考以下文章

27.6 Parallel的静态For,Foreach和Invoke方法

打破parallel.foreach?

计算 Parallel.ForEach 使用的线程数

Parallel类

何时使用 Parallel.ForEach,何时使用 PLINQ

Parallel