创建.Net 4.0并行任务时检查空闲核心数

时间:2010-11-01 08:09:37

标签: multithreading parallel-processing task-parallel-library

我的问题可能听起来有些天真,但我对多线程编程很新。

我正在编写一个处理传入外部数据的应用程序。对于到达的每个数据,将按以下方式创建新任务:

System.Threading.Tasks.Task.Factory.StartNew(() => methodToActivate(data));

数据项非常快(每秒,半秒等等)到达,因此创建了很多任务。处理每项任务可能需要大约一分钟。在测试时,我看到线程数量一直在增加。如何限制创建的任务数,因此实际工作线程数稳定高效。我的电脑只是双核心。

谢谢!

3 个答案:

答案 0 :(得分:2)

您的一个问题是默认调度程序会看到持续一分钟的任务,并假设它们在另一个尚未执行的任务上被阻止。为了尝试解除阻塞,它会调度更多未决任务,从而增加线程。你可以在这里做几件事:

  • 缩短您的任务(可能不是一个选项)。

  • 编写一个处理此方案的调度程序,但不添加更多线程。

  • 使用SetMaxThreads来阻止 无限制的线程池增长。

请参阅此处的线程注入部分:

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

答案 1 :(得分:0)

您应该考虑在the producer/consumer pattern周围BlockingCollection<T>使用ConcurrentQueue<T>,并根据工作负载的特点将BoundedCapacity设置为有意义的内容。您可以对BoundedCapacity进行配置,然后在进行一些分析会话时进行调整以找到最佳位置。

虽然TPL确实会对您创建的任务进行排队,但创建太多任务并不会受到惩罚。另外,生产更多工作的重点是什么?你想要产生足够的工作,消费者永远不会饿死,但你不想远远超过自己,因为这只是浪费资源,并可能从你的消费者那里偷走那些相同的资源。

答案 2 :(得分:0)

您可以为任务并行库创建自定义TaskScheduler,然后通过将其实例传递给TaskFactory构造函数来计划任务。

以下是如何执行此操作的一个示例:Task Scheduler with a maximum degree of parallelism