簡體   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