【发布时间】: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