gpt4 book ai didi

multithreading - 线程数随着Parallel.Foreach循环的进行而减少

转载 作者:行者123 更新时间:2023-12-03 13:00:18 25 4
gpt4 key购买 nike

我有一个并行的Foreach循环,该循环遍历项目列表,并对它们执行一些操作。根据项目的不同,其中一些操作会比其他操作花费更长的时间。

Parallel.ForEach(list, new ParallelOptions { MaxDegreeOfParallelism = 5 }, item =>
{
var subItems = item.subItems;
foreach (var subItem in subItems)
{
//do some actions for subItem
}

Console.WriteLine("Action Complete for {0}", item);
});

过了一会儿,当列表中只剩下5-10个项目要运行时,似乎只剩下1个线程正在运行。这是不理想的,因为某些项目随后会被卡在另一个项目之后才能完成。

如果我停止脚本,然后再次启动它,并且列表中仅剩下5-10个项目,它将旋转多个线程以再次并行执行每个项目。

如何确保其他线程将继续使用,而无需重新启动脚本?

最佳答案

这里的问题是默认的分区程序将每个任务的工作分成N items个块。假定项目数很大,并且每个项目花费相同的时间,那么您可以预期多个线程将运行最后的〜N * 5个项目,并且所有线程都同时完成。

但是,在您的情况下,这是不正确的。您可以编写自己的Partitioner以在每个块中使用较少的项目,请参阅Partitioner Class。这可能会提高性能,但是每个项目完成的工作量很小,那么您将增加有用的工作与完成任务管理工作的比率,并可能降低性能。

您还可以编写一个动态分区程序,以减小分区大小,以使最后几项位于较小的分区中,从而确保您仍在使用所有可用线程。此MSDN文章介绍编写自定义分区Custom Partitioners for PLINQ and TPL

关于multithreading - 线程数随着Parallel.Foreach循环的进行而减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23015419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com