MaxDegreeOfParallelism如何运作?

时间:2015-03-17 21:24:01

标签: c# task-parallel-library scheduling

我试图理解MaxDegreeOfParallelism在调用Parallel.For时实际上如何影响并行性。这是我正在尝试的代码:

  static void Main(string[] args)
  {
     var parallelOptions = new ParallelOptions()
        {
           MaxDegreeOfParallelism = 1000,
        };

     Parallel.For(1, 1000, parallelOptions, i =>
        {
           Console.WriteLine(i);
           Thread.Sleep(TimeSpan.FromHours(1));
        });
  }

当我运行此代码时,我立即看到控制台输出1到9(在~0.1秒内)。然后每秒一次添加一个新的数字--10,11,12等等。同时,在Windows任务管理器中,我看到进程中执行线程的数量每秒增加一个新线程。

使用此代码,为什么我不能立即看到值1到1000的输出?

(我意识到这段代码可能没有任何意义,在我的笔记本电脑上启动1000个线程可能是一个坏主意,但我想了解这里发生了什么)

编辑:在我看来,这个问题被错误地标记为重复。我知道MaxDegreeOfParallelism是 max 并行度。当然,如果我有1000个线程同时运行,那么会有大量的上下文切换,但链接的问题并没有解释它实际上是如何工作的。如果我只想运行更合理数量的线程,比如32,怎么办?我的计算机能够很好地处理它,但是有了Parallel的行为。如上所述,需要大约20秒的时间来旋转这些线程。

1 个答案:

答案 0 :(得分:3)

MaxDegreeOfParallelism 是指并行循环将在任何时间安排的最大工作任务数。

并行度由并行类,默认任务调度程序和.NET线程池的实现自动管理。吞吐量在各种条件下都得到了优化。

对于非常大的并行度,您可能还想使用ThreadPool类的 SetMinThreads 方法,以便无延迟地创建这些线程 。如果不这样做,那么线程池的线程注入算法可能会限制线程添加到并行循环使用的工作线程池的速度。它可能比您想要创建所需数量的线程花费更多时间。