Parallel.For 接近尾声时变为单线程
Parallel.For becomes single threaded near the end
我目前在使用 Parallel.For 时遇到了问题。
我正在尝试 运行 一批 ~1000 个相当长的 运行ning 任务(每个 运行ning 大约 120 秒),我的问题似乎是,在最后10-20次迭代,处理变成单线程。
伪代码:
Parallel.For(0, 1000,
(i, loopState)=>
{
//Do lots of work
Thread.Sleep(120_000);
});
你们知道为什么会这样吗?如何解决这个问题?
我想我已经解决了问题,或者至少找到了解决问题的方法。
遗憾的是,我问题中的示例代码并不能 100% 代表我的代码,在我的代码中,我使用了 localInit
和 localFinally
的重载。我以为这无关紧要,但似乎确实如此。
我的猜测是,在这样做的过程中,内部实现对我的循环迭代进行了分区,并将每个分区静态分配给一个单独的线程。由于每个元素的处理时间都大不相同,因此导致一个分区比其他分区花费的时间长得多,因此是单线程。
修复是使用我的问题中引用的重载,它似乎没有遇到这个问题。
我目前在使用 Parallel.For 时遇到了问题。 我正在尝试 运行 一批 ~1000 个相当长的 运行ning 任务(每个 运行ning 大约 120 秒),我的问题似乎是,在最后10-20次迭代,处理变成单线程。
伪代码:
Parallel.For(0, 1000,
(i, loopState)=>
{
//Do lots of work
Thread.Sleep(120_000);
});
你们知道为什么会这样吗?如何解决这个问题?
我想我已经解决了问题,或者至少找到了解决问题的方法。
遗憾的是,我问题中的示例代码并不能 100% 代表我的代码,在我的代码中,我使用了 localInit
和 localFinally
的重载。我以为这无关紧要,但似乎确实如此。
我的猜测是,在这样做的过程中,内部实现对我的循环迭代进行了分区,并将每个分区静态分配给一个单独的线程。由于每个元素的处理时间都大不相同,因此导致一个分区比其他分区花费的时间长得多,因此是单线程。
修复是使用我的问题中引用的重载,它似乎没有遇到这个问题。