我有一个外部单线程程序,需要使用不同的参数运行数百次。为了使其更快,我想同时为每个内核运行一次。为此,我使用在具有不同参数的列表上运行的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);
非常感谢!