Parallel.For在末尾附近成为单线程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Parallel.For在末尾附近成为单线程相关的知识,希望对你有一定的参考价值。
我目前正在使用Parallel.For遇到一个问题。我正在尝试运行一批〜1000个相当长时间运行的任务(每个运行120秒),我的问题似乎是,在最后的10-20次迭代中,处理变为单线程。
伪代码:
Parallel.For(0, 1000,
(i, loopState)=>
{
//Do lots of work
Thread.Sleep(120_000);
});
你们知道为什么会这样,这个问题怎么解决?
答案
我想我已经找到了问题,或者至少找到了一个让它消失的解决方案。
遗憾的是,我的问题中的示例代码并非100%代表我的代码,在我的代码中,我使用了localInit
和localFinally
的重载。我认为这没关系,但似乎确实如此。
我的猜测是,在这样做时,内部实现将我的循环迭代分区并将每个分区静态分配给一个单独的线程。由于每个元素花费了大量不同的处理时间,因此一个分区比其他分区花费的时间更长,因此单线程。
修复是使用我的问题中引用的重载,这似乎没有遇到此问题。
以上是关于Parallel.For在末尾附近成为单线程的主要内容,如果未能解决你的问题,请参考以下文章
Parallel.For(Foreach) 将创建多少个线程?默认 MaxDegreeOfParallelism?