【问题标题】:Thread Pool and Parallel.For combination - is it possible线程池和Parallel.For组合 - 是否可能
【发布时间】:2016-11-12 20:26:46
【问题描述】:

在我的应用程序中,我有许多类可以使用Parallel.For 语句计算它们的任务。每个Parallel.For 都使用自己的ParallelOption 来设置最大并行度。

应用程序流程取决于用户设置,因此存在以下情况:A 类(并行计算)调用 B 类(也并行计算)或调用 C 类(不使用任何并行计算) .

另一种模式是递归调用,在每个递归级别上完成并行计算。

我的问题:

是否可以设置一个全局线程池,所有类都使用它来进行计算,并且线程数可以全局控制以供应用程序使用?

是否可以将线程池​​与Parallel.For 结合使用,从而使大部分现有代码保持不变?

与独立的 parallel.for 调用相比,线程池需要多少开销(我知道这一切都取决于,到最后我需要做一些测试,但也许你有一些好的和坏的过期和好的建议)

【问题讨论】:

    标签: c# task-parallel-library


    【解决方案1】:

    是否可以设置一个供所有人使用的全局线程池 类进行计算,线程数受控制 全球申请?

    情况已经如此。目前,应用程序线程池由 .NET 运行时管理。所以你可以很确定,你所有的类(在一个正在运行的应用程序中)都使用同一个线程池。您可以使用Tasks、静态ThreadPool 类或静态Parallel 类来访问线程池。

    是否可以将线程池​​与 Parallel.For 所以大多数 现有代码保持不变?

    Parallel.For 在内部使用 TasksTaskScheduler。因此,将使用相同的线程池。

    【讨论】:

    • 你知道如何控制线程池的大小吗?如果使用 MAXDOP = 10 调用 Parallel.For,然后在每个线程中调用一个方法,该方法使用 MAXDOP = 10 调用另一个 Parallel.For,则有多少个线程。最大是 10 + 10* 10?
    • @SebastianWidz,你不应该控制线程池的大小,你不能直接这样做。 .NET 运行时几乎可以肯定可以更有效地做到这一点。您应该阅读有关parallel loops 的更多信息。在 2 核系统上将并行度设置为 10 可能会减慢整个过程。
    • 是的,我知道过高的 DOP 会减慢速度,目前我设置了 MAXDOP = Environment.ProcessorCount,但是当单个线程调用调用另一个并行循环的方法时会发生什么 - 你得到线程数的乘法。这就是我问这个问题的原因。为所有调用一起设置一个常数od线程不是很方便吗
    【解决方案2】:

    Parallel.For 默认使用所有线程池线程,线程池线程的数量针对您的 cpu(s) 进行了优化。 MaxDegreeOfParallelism 仅在您希望为给定循环使用所有线程池线程时有用。

    只需使用Parallel.For,不要想太多。

    稍后,如果您的应用确实需要它,您仍然可以使用自己的线程池创建自己的TaskScheduler...但您实际上需要这样做的可能性很小。

    【讨论】:

      猜你喜欢
      • 2014-07-10
      • 2015-07-26
      • 2012-06-16
      • 2018-03-06
      • 2011-02-09
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多