簡體   English   中英

.NET中的分散式任務調度技術

[英]Decentralized Task Scheduling Techniques in .NET

我一直在嘗試學習有關CLR 4.0的更多詳細信息。 以及ThreadPool和Microsoft建議的其他策略。 我認為自己在許多這些主題上都是最新的,並且每天使用線程和並發代碼。

最近,我又重新審視了並行模式和實踐 ,並且對“ 分散式調度技術”部分有所了解,該部分簡要概述了“工作竊取”以及本地線程隊列和全局線程隊列。

我的問題是:

1) 工作在偷偷加入還是選擇退出? 使用本地線程隊列是否相同? 還是默認情況下在CLR 4.0中發生?

2)我們可以控制使用本地線程隊列還是全局線程隊列? 如果是這樣,通過什么API調用?

1)工作是在偷偷加入還是選擇退出? 使用本地線程隊列是否相同? 還是默認情況下在CLR 4.0中發生?

默認是偷工作。 在.NET 4.0中,ThreadPool擴展了工作竊取行為。 並且默認TaskScheduler(System.Threading.Tasks.ThreadPoolTask​​Scheduler)基於ThreadPool類。 因此它是默認值,因為4.0。

2)我們可以控制使用本地線程隊列還是全局線程隊列? 如果是這樣,通過什么API調用?

如@Servy所述,要完全控制,您需要編寫自己的TaskScheduler。 (如如何:創建限制並發性的任務計划程序中所述

但是您可以通過TaskCreationOptions以某種方式影響排隊行為:

  • LongRunning :任務在Treadpool之外獲取一個新創建的線程
  • PreferFairness :新的子任務(通常將在執行父任務的線程的本地隊列中結束)將在全局隊列中結束。 因此,如果所有任務都標記有“ PreferFairness”,則將有效地禁用工作竊取和本地排隊。

但是,正如有關PreferFairness的這篇文章所強調的那樣,這些標志的實現細節/效果可能會隨着.NET框架的新實現而發生變化。

您都無法控制。 那就是描述默認線程調度程序如何調度它的任務。 這就是它的工作原理。 您可以完全創建自己的TaskScheduler,並從頭開始編寫自己的調度程序,還可以使用TaskCreationOptions向調度程序提供一些提示(如果需要,可以隨意忽略),但是這些選項都不允許您指定任務進入哪個隊列。

任務模型的主要是,您無需擔心此類細節。 目的是可以通過任何工作線程以任何順序調度工作,並且您要允許框架調度程序盡最大努力優化工作。 添加常量使其更難以有效地執行此操作。 如前所述,如果您需要用於調度任務的完全不同的算法,則可以使用自定義任務調度器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM