【问题标题】:Limit number of processors used in ThreadPool限制线程池中使用的处理器数量
【发布时间】:2012-07-11 11:53:17
【问题描述】:

有没有办法限制 ThreadPool 对象将使用的处理器数量?根据文档,“您不能将工作线程的数量或 I/O 完成线程的数量设置为小于计算机中处理器数量的数字。”

那么如何限制我的程序不消耗所有处理器?

【问题讨论】:

  • 你为什么要这样做?
  • 因为我的处理器上有 8 个内核,我希望我正在运行的进程在运行时不会消耗 100% 的 CPU,因为它会锁定我的机器。
  • 如果它锁定了你的机器,你应该解决这个问题,可能通过设置进程的优先级。我不确定强制使用较少数量的处理器是否会有所帮助。

标签: c# .net multithreading threadpool


【解决方案1】:

经过一些实验,我想我已经掌握了这个东西。我注意到ThreadPool 将系统中的处理器数量视为当前进程可用的处理器数量。这对您有利。

我的 CPU 中有 4 个内核。尝试使用 2 调用 SetMaxThreads

ThreadPool.SetMaxThreads(2, 2);

失败,因为我有 4 个核心,因此数字保持在初始值(我的系统为 1023 和 1000)。

但是,就像我最初所说的那样,ThreadPool 只考虑进程可用的处理器数量,我可以使用Process.ProcessorAffinity 管理这些数量。这样做:

Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(3);  

将可用处理器限制为前两个内核(因为 3 = 11 二进制)。再次拨打SetMaxThreads

ThreadPool.SetMaxThreads(2, 2);

应该像魅力一样工作(至少它对我有用)。只需确保在程序启动时使用关联设置!

当然,我不鼓励这种 hack,因为无论如何,您的进程在整个执行期间都会被有限数量的核心卡住。

【讨论】:

    【解决方案2】:

    线程池专门设计用于消除手动管理线程的所有麻烦。 OS 任务调度器已经研究了很多年,并且在调度任务执行方面做得非常好。调度程序会考虑多个选项,例如线程优先级、内存位置和与处理器的接近程度等。除非您对这些进程有深入了解,否则最好不要设置线程亲和性。

    如果我可以引用docs

    线程亲和性强制线程在特定的子集上运行 处理器。通常应避免设置线程亲和性, 因为它会干扰调度器的调度能力 有效地跨处理器线程。这可以减少 并行处理产生的性能增益。 适当的使用 线程关联性正在测试每个处理器。

    虽然可以设置Thread 关联(相关post),但您需要创建自己的线程对象(而不是来自线程池的对象)。据我所知,您无法为池中的线程设置线程亲和性。

    【讨论】:

      【解决方案3】:

      由于 SetMaxThreads 不允许您设置否。线程数低于 no。处理器的最佳选择是在 TPL 中编写自己的 TaskScheduler,通过对任务进行排队来限制并发性。然后,您可以使用该调度程序创建任务,而不是将项目添加到线程池。

      How to: Create a Task Scheduler That Limits the Degree of Concurrency

      【讨论】:

      • 您是否阅读了问题中的引文?您不能将线程数设置为低于处理器数的数字。
      • @svick 没有注意到这一点。更新了答案。
      【解决方案4】:

      您通常不会限制线程池,而是限制程序一次生成的线程数。 Task Parallel Library 允许您设置MaxDegreeOfParallelism,或者您可以使用Semaphore

      【讨论】:

      • 您能否解释一下TPL 提供哪些方式
      • 这篇文章中还有一些有趣的讨论:stackoverflow.com/questions/2521840/…
      • MaxDegreeOfParallelism 特定于Parallel.ForEach() 和来自Parallel 的其他方法。在此之外它无法使用。
      猜你喜欢
      • 1970-01-01
      • 2010-12-29
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 2011-04-10
      • 2021-11-17
      • 1970-01-01
      相关资源
      最近更新 更多