在任务并行库实现中查询

时间:2011-03-08 10:17:18

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

全部好,

我的查询是关于TaskParallel库的实现。

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

实施此方法的最佳方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

我不清楚你的场景,但是这种方法可以用来限制正在执行的任务的最大数量,但可能不会保证三个一直运行,只是一次不能运行三个。

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

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

答案 2 :(得分:0)

你有没有看过System.Threading?有一个Parallel类,看起来就像你要找的那样。