.NET中的分散任务调度技术

时间:2013-08-09 15:11:19

标签: c# .net clr clr4.0 work-stealing

我一直在尝试了解有关CLR 4.0的更多详细信息。以及ThreadPool和Microsoft推荐的不同策略。我认为自己在很多这些主题上都是最新的,并且每天都使用线程和并发代码。

我最近再次回到Parallel Patterns and Practices,我对分散式调度技术部分有所了解,该部分简要概述了“工作窃取”以及本地与全局线程队列。

我的问题是:

1)是否正在窃取选择加入或退出?使用本地线程队列相同吗?或者这是否在CLR 4.0默认情况下发生?

2)我们是否可以控制是否使用本地或全局线程队列?如果是这样,通过什么API调用?

2 个答案:

答案 0 :(得分:1)

  

1)工作是否会选择加入或选择退出?使用本地线程也是如此   队列?或者这是否在CLR 4.0默认情况下发生?

工作窃取是默认的。在.NET 4.0中,ThreadPool扩展了工作窃取行为。默认的TaskScheduler(System.Threading.Tasks.ThreadPoolTask​​Scheduler)基于ThreadPool类。所以它是默认的,因为4.0。

  

2)我们是否可以控制使用本地线程还是全局线程   队列?如果是这样,通过什么API调用?

正如@Servy已经提到的,为了完全控制,你需要编写自己的TaskScheduler。 (如How to: Create a Task Scheduler That Limits Concurrency

中所述

但是你可以用TaskCreationOptions

以某种方式影响排队行为
  • LongRunning :任务获取Treadpool外新创建的线程
  • PreferFairness :新的子任务(通常最终会在执行父任务的线程的本地队列中)将最终进入全局队列。因此,如果所有任务都标有“PreferFairness”,则工作窃取和本地排队将被有效停用。

但是,正如this article about PreferFairness强调的那样,这些标志的实现细节/效果可能会随着.NET框架的新实现而改变。

答案 1 :(得分:0)

你无法控制。这是描述默认线程调度程序如何安排它的任务。这就是它的工作原理。您可以完全创建自己的TaskScheduler,并从头开始编写自己的调度程序,也可以使用TaskCreationOptions向调度程序提供一些提示(如果需要,可以自由忽略),但这些选项都没有允许您指定任务进入哪些队列。

任务模型的主要是您无需担心此类细节;意图是任何工作线程可以按任何顺序调度工作,并且您允许框架调度程序最好地优化工作。添加常量使得它更难以有效地执行此操作。如前所述,如果您需要一种完全不同的算法来安排任务,则可以使用自定义任务调度程序。