我有一个外部单线程序,需要使用不同的参数运行数百次。为了加快速度,我希望同时为每个核心运行一次。为此,我使用在具有不同参数的列表上运行的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个)项填充参数列表时,不会发生这种情况。
有人可以向我解释这种行为吗?任何提示或提示赞赏!
答案 0 :(得分:1)
Scott在上面的评论中提示将其改为以下代码,使其表现得如我所愿:
OrderablePartitioner<ParamType> partitioner =
Partitioner.Create(ListWithAllTheParams, EnumerablePartitionerOptions.NoBuffering);
var parallelOptions = new ParallelOptions {
MaxDegreeOfParallelism = Environment.ProcessorCount // 8 for me
};
Parallel.ForEach(partitioner, parallelOptions, DoTheStuff);
非常感谢!