Parallel.ForEach停止对最后几项进行平行处理
我有一个外部单线程程序,需要使用不同的参数运行数百次。 为了让它更快,我想同时为每个内核运行一次。 为此,我使用运行在具有不同参数的列表上的Parallel.ForEach传递给外部程序:
var parallelOptions = new ParallelOptions {
MaxDegreeOfParallelism = Environment.ProcessorCount // 8 for me
};
Parallel.ForEach(ListWithAllTheParams, parallelOptions, DoTheStuff);
...
private void DoTheStuff(ParamType parameter, ParallelLoopState parallelLoopState, long index)
{
// prepare process parameters etc.
theProcess.Start();
theProcess.WaitForExit();
}
非常简单,并且效果很好......直到最后~10个项目 - 由于某种原因,它们不会并行化,只是一个接一个地运行。 我已经通过查看任务管理器中的CPU使用情况和正在运行的程序来确认这一点。
只有少数(比如10个)项目填充参数列表时才会发生这种情况。
有人可以向我解释这种行为吗? 任何提示或提示表示赞赏!
在上述评论中Scott的提示将它改为下面的代码使其表现得如我所愿:
OrderablePartitioner<ParamType> partitioner =
Partitioner.Create(ListWithAllTheParams, EnumerablePartitionerOptions.NoBuffering);
var parallelOptions = new ParallelOptions {
MaxDegreeOfParallelism = Environment.ProcessorCount // 8 for me
};
Parallel.ForEach(partitioner, parallelOptions, DoTheStuff);
非常感谢!
链接地址: http://www.djcxy.com/p/50155.html上一篇: Parallel.ForEach stops being parallel for the last few items