【问题标题】:Query in Task Parallel Library implementation任务并行库实现中的查询
【发布时间】:2011-03-08 10:17:18
【问题描述】:

大家好,

我的问题是关于 TaskParallel 库的实现。

我有一个清单。我需要并行执行所有任务,并且在任何时间点,正在执行的任务数应该是 3。即,如果我有 9 个任务,则最初应该启动前 3 个任务,如果完成了任何 1 个任务应该启动下一个任务,并且在任何时候运行的任务都不应超过 3 个。

实现这一点的最佳方法是什么?

谢谢!

【问题讨论】:

    标签: .net parallel-processing task task-parallel-library


    【解决方案1】:

    如果您使用的是Parallel::ForEach,则可以使用采用ParallelOptions 的重载,您将在其上设置MaxDegreeOfParallelism = 3。如果您使用 PLINQ,则可以使用 WithDegreeOfParallelism(3)

    请记住,这只会限制在任何给定时间可能正在执行您的工作的最大线程数,它确实/不能保证所有三个线程都必须能够启动/运行一次。

    【讨论】:

      【解决方案2】:

      您是否已经研究过 System.Threading?有一个 Parallel 类,这似乎是您正在寻找的。​​p>

      【讨论】:

      • System.Threading.Parallel 是任务并行库 (TPL) 的一部分
      【解决方案3】:

      您可以实现一个限制并行度的调度程序。

      http://msdn.microsoft.com/en-us/library/ee789351.aspx

      我不清楚您的方案,但这种方法可用于限制正在执行的任务的最大数量,但可能不能保证三个始终运行,只是一次运行不超过三个。

      另一种方法可能是启动三个任务并让它们从包含执行实际工作所需信息的 ConcurrentQueue 中读取数据。这将允许您始终并行执行三件事。

      您所做的基本上与 TPL 背后的哲学有些不一致,后者实际上是将您的工作表达为潜在的并行性,并让运行时将其安排在尽可能多的可用内核上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多