繁体   English   中英

Task Parallel Library如何执行负载平衡?

[英]How Task Parallel Library performs load balancing?

我们都知道,为了真正执行异步操作,我们的机器必须具有多个内核,每个内核将运行自己的线程,该线程将执行其任务。

让我们从一个例子开始,其中有一个四核cpu4个任务 为了使用C#以真正的并行度运行我们的四个任务,我们将必须分别创建和运行四个任务,如下所示:

public static void Main()
{    
   // Define and run the tasks.
   Task[] tasks = {
      Task.Run( () => WorkA() ),
      Task.Run( () => WorkB() ),
      Task.Run( () => WorkC() ),
      Task.Run( () => WorkD() )
   }

   Task.WaitAll(tasks);
}

在此示例中, TPL将为每个任务提供来自ThreadPool的线程,并在可能的情况下在不同的处理器中运行每个线程。 (我希望我是对的)

场景:

假设我们有四核cpu6个任务 ,我们编写了以下代码:

public static void Main()
{    
   // Define and run the tasks.
   Task[] tasks = {
      Task.Run( () => WorkA() ),
      Task.Run( () => WorkB() ),
      Task.Run( () => WorkC() ),
      Task.Run( () => WorkD() ),
      Task.Run( () => WorkE() ),
      Task.Run( () => WorkF() )
   }

   Task.WaitAll(tasks);
}

TPL会知道什么是最好的足够数量的线程并计划其中的任务吗? (考虑核心的状态和任务的负载差异)

例如:

  • 总共3个线程-每个线程2个任务。 (可以说一个核心很忙)
  • 总共4个线程-3个线程-每个线程1个任务,最后一个任务3个任务。
  • 总共6个线程-每个线程1个任务。

TPL如何执行负载平衡? TPL考虑什么以提供最佳的负载平衡。

TPL会知道什么是最好的足够数量的线程并计划其中的任务吗?

否。然后您会觉得更复杂:

Task.Run()将Task添加到全局队列。 假设您的池中已经有4个空闲线程,那么它们将尝试从全局队列中获取Tasks,该操作涉及同步和锁定。 根据每个任务的工作量,让一个或两个线程来处理所有任务可能会更有效率。 如果池中只有一个线程怎么办? 创建3个以上的线程可能比通过单个线程执行任务更昂贵。 当然,该信息在运行时不可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM