[英]How to use task parallel library (TPL) with load balancing and limited degree of parallelism?
[英]How Task Parallel Library performs load balancing?
我们都知道,为了真正执行异步操作,我们的机器必须具有多个内核,每个内核将运行自己的线程,该线程将执行其任务。
让我们从一个例子开始,其中有一个四核cpu和4个任务 。 为了使用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的线程,并在可能的情况下在不同的处理器中运行每个线程。 (我希望我是对的)
场景:
假设我们有四核cpu和6个任务 ,我们编写了以下代码:
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会知道什么是最好的足够数量的线程并计划其中的任务吗? (考虑核心的状态和任务的负载差异)
例如:
TPL如何执行负载平衡? TPL考虑什么以提供最佳的负载平衡。
TPL会知道什么是最好的足够数量的线程并计划其中的任务吗?
否。然后您会觉得更复杂:
Task.Run()
将Task添加到全局队列。 假设您的池中已经有4个空闲线程,那么它们将尝试从全局队列中获取Tasks,该操作涉及同步和锁定。 根据每个任务的工作量,让一个或两个线程来处理所有任务可能会更有效率。 如果池中只有一个线程怎么办? 创建3个以上的线程可能比通过单个线程执行任务更昂贵。 当然,该信息在运行时不可用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.