【问题标题】:Is it possible to change parallelOptions.MaxDegreeOfParallelism during execution of a Parallel.ForEach?是否可以在执行 Parallel.ForEach 期间更改 parallelOptions.MaxDegreeOfParallelism
【发布时间】:2010-09-13 22:52:40
【问题描述】:

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

protected ParallelOptions parallelOptions = new ParallelOptions();

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

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

parallelOptions.MaxDegreeOfParallelism = 5;

似乎没有增加线程数。有人有什么想法吗?

【问题讨论】:

  • 您能解释一下为什么要这样做吗?如果需要,它会自行将线程数增加到指定的最大值,或者在适当的情况下使用更少的线程数。
  • 主要是为了在共享服务器上使用过多资源时限制应用程序。我让服务器以 100% 运行,这降低了服务器上其他应用程序的响应能力。
  • 这是受 CPU 限制的问题还是磁盘等其他“资源”问题?
  • 这种情况尤其是 CPU,但是线程的数量可能会影响内存和磁盘以及取决于 foreach 的内容。如果系统资源负担过重,我希望能够更改使用的总线程数。

标签: c# multithreading parallel-processing task-parallel-library


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    我不希望在您致电ForEach 之后更改并行度。据我了解,ForEach 将确定它可以创建多少个线程,创建多少个分区,并创建对这些分区进行操作的线程。没有一点可以说,“哦,等等,他改变了我们的资源分配,让我重新分区数组并重新分配线程。”

    【讨论】:

    • 是的,我同意你的理解,但是你能添加一个参考链接吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    相关资源
    最近更新 更多