MaxDegreeOfParallelism 是如何工作的?
How does MaxDegreeOfParallelism work?
我正在尝试了解调用 Parallel.For 时 MaxDegreeOfParallelism 实际上如何影响并行度。这是我正在试验的代码:
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 个线程 运行ning,将会有大量的上下文切换,但是链接的问题并没有解释它是如何工作的。如果我只想 运行 更合理的线程数,比如 32,该怎么办?我的计算机能够很好地处理这个问题,但是根据上述 Parallel.For 的行为,需要大约 20 秒才能启动该数量的线程。
MaxDegreeOfParallelism是指一个并行循环在任意时刻最多调度的worker任务数
并行度由 Parallel class、默认任务计划程序和 .NET 线程池的实现自动管理。吞吐量在各种条件下得到优化。
对于非常大的并行度,您可能还想使用 ThreadPool class 的 SetMinThreads 方法以便这些线程的创建 没有延迟 。如果您不这样做,那么线程池的线程注入算法可能会限制将线程添加到并行循环使用的工作线程池的速度。创建所需数量的线程所花的时间可能比您希望的要长。
我正在尝试了解调用 Parallel.For 时 MaxDegreeOfParallelism 实际上如何影响并行度。这是我正在试验的代码:
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 个线程 运行ning,将会有大量的上下文切换,但是链接的问题并没有解释它是如何工作的。如果我只想 运行 更合理的线程数,比如 32,该怎么办?我的计算机能够很好地处理这个问题,但是根据上述 Parallel.For 的行为,需要大约 20 秒才能启动该数量的线程。
MaxDegreeOfParallelism是指一个并行循环在任意时刻最多调度的worker任务数
并行度由 Parallel class、默认任务计划程序和 .NET 线程池的实现自动管理。吞吐量在各种条件下得到优化。
对于非常大的并行度,您可能还想使用 ThreadPool class 的 SetMinThreads 方法以便这些线程的创建 没有延迟 。如果您不这样做,那么线程池的线程注入算法可能会限制将线程添加到并行循环使用的工作线程池的速度。创建所需数量的线程所花的时间可能比您希望的要长。