![](/img/trans.png)
[英]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.