【问题标题】:How does MaxDegreeOfParallelism work?MaxDegreeOfParallelism 是如何工作的?
【发布时间】:2015-03-17 21:24:00
【问题描述】:

我试图了解 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.For 的行为,如上所述,启动该数量的线程需要大约 20 秒。

【问题讨论】:

  • 因为它是一个 Max DOP,而不是并行完成多少事情的确切值。由于您的计算机无法同时(可能)执行 1000 个任务,因此它不会尝试。 MaxDOP 是一个限制器,例如将 MaxDOP 限制为 2,而不是您的盒子上有多少核心。
  • 简而言之,如果您不使用处理器。它将阻碍所有任务在您指定的最大值内并行运行。这对于 SQL 来说尤其常见。
  • 我的电脑可以同时运行1000个线程。如果我告诉 Parallel.For 运行 32 个线程,为什么它在启动每个新线程之间等待 1 秒?

标签: c# task-parallel-library scheduling


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2022-03-27
    • 1970-01-01
    相关资源
    最近更新 更多