Nit*_*amk 5 c# scheduling task-parallel-library
我试图了解调用 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));
});
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我立即看到控制台输出 1 到 9(大约 0.1 秒内)。然后每秒都会添加一个新数字 - 10、11、12 等等。同时,在 Windows 任务管理器中,我看到进程中执行线程的数量随着每秒一个新线程的增加而增加。
使用这段代码,为什么我不能立即看到值 1 到 1000 的输出?
(我意识到这段代码可能毫无意义,并且在我的笔记本电脑上启动 1000 个线程可能是一个坏主意,但我想了解这里发生了什么)
编辑:在我看来,这个问题被错误地标记为重复。据我所知,MaxDegreeOfParallelism 是最大并行度。当然,如果我有 1000 个线程同时运行,就会有大量的上下文切换,但链接的问题并没有解释它实际上是如何工作的。如果我只想运行更合理数量的线程(例如 32 个)怎么办?我的计算机能够很好地处理这个问题,但是由于并行的行为,如上所述,需要约 20 秒才能启动该数量的线程。
MaxDegreeOfParallelism是指并行循环在任意时刻将调度的最大工作任务数。
\n\n并行度由Parallel 类、默认任务调度程序和 .NET 线程池的实现自动管理。吞吐量在多种条件下得到优化。
\n\n对于非常大程度的并行性,您可能还需要使用 ThreadPool 类\xe2\x80\x99s SetMinThreads方法,以便毫不延迟地创建这些线程。如果不这样做,则线程池\xe2\x80\x99s 线程注入算法可能会限制将线程添加到并行循环使用的工作线程池中的速度。创建所需数量的线程可能需要比您想要的更多的时间。
\n| 归档时间: |
|
| 查看次数: |
2714 次 |
| 最近记录: |