gpt4 book ai didi

c# - 是否可以在执行 Parallel.ForEach 期间更改 parallelOptions.MaxDegreeOfParallelism?

转载 作者:IT王子 更新时间:2023-10-29 04:50:28 25 4
gpt4 key购买 nike

我正在运行一个多线程循环:

protected ParallelOptions parallelOptions = new ParallelOptions();

parallelOptions.MaxDegreeOfParallelism = 2;
Parallel.ForEach(items, parallelOptions, item =>
{
// Loop code here
});

我想在并行循环执行期间更改parallelOptions.MaxDegreeOfParallelism,以减少或增加线程数。

parallelOptions.MaxDegreeOfParallelism = 5;

好像没有增加线程。有人有什么想法吗?

最佳答案

即使尝试这样做,问题在于这是一个难题。对于初学者,您如何可靠地观察 CPU 和磁盘利用率?不频繁地对 CPU 进行采样将无法很好地了解实际发生的情况,而对磁盘利用率进行采样则更加困难。其次,您的任务的粒度是多少,您可以多久快速更改一次正在运行的数字。第三,事情会随着时间的推移而迅速变化,因此您需要对您的观察结果进行某种过滤。第四,理想的线程数取决于代码实际运行的 CPU。第五,如果您分配了太多线程,您将在它们之间来回奔波而不是做有用的工作。

参见 http://msdn.microsoft.com/en-us/magazine/ff960958.aspx有关 .NET 中的线程池如何处理决定使用多少线程的复杂任务的讨论。

您还可以使用反射器并查看 TPL 用于分配线程和避免不必要的上下文切换的代码 - 它很复杂,甚至没有考虑磁盘访问!

您可以改为尝试在优先级较低的线程上执行任务(创建您自己的 TaskScheduler 来运行优先级低于正常值的线程实际上非常容易)。这至少将确保您可以在不影响系统其余部分的情况下运行 100% 的 CPU。弄乱线程优先级本身就充满了问题,但如果这是一个纯粹的后台任务,它可以很简单并且可能有所帮助。

但通常情况下,当其他应用程序受到一个贪婪应用程序的影响时,磁盘利用率才是真正的罪魁祸首。 Windows 可以轻松地在应用程序之间公平地分配 CPU,但是当涉及到相对较慢的磁盘访问时,这就完全是另一回事了。与其尝试动态调整您正在运行的线程数,您可能需要简单地限制您的应用程序,使其不会过于频繁地访问磁盘。这是您可以在不更改事件线程数的情况下执行的操作。

您还可以将 SetPriorityClass 视为一种通知操作系统您的进程不如系统上运行的其他应用程序重要的方法,请参阅 How can I/O priority of a process be increased?了解更多信息。但这假设您的整个过程不那么重要,而不仅仅是这一部分。

关于c# - 是否可以在执行 Parallel.ForEach 期间更改 parallelOptions.MaxDegreeOfParallelism?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3705006/

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