[英]TPL force higher parallelism
當排隊Tasks
的線程池 ,代碼依賴於默認TaskScheduler
執行它們。 在我的代碼示例中,我可以看到在單獨的線程上最多並行執行7個Tasks
。
new Thread(() =>
{
while (true)
{
ThreadPool.GetAvailableThreads(out var wt, out var cpt);
Console.WriteLine($"WT:{wt} CPT:{cpt}");
Thread.Sleep(500);
}
}).Start();
var stopwatch = new Stopwatch();
stopwatch.Start();
var tasks = Enumerable.Range(0, 100).Select(async i => { await Task.Yield(); Thread.Sleep(10000); }).ToArray();
Task.WaitAll(tasks);
Console.WriteLine(stopwatch.Elapsed.TotalSeconds);
Console.ReadKey();
有沒有一種方法可以強制調度程序在其他線程上啟動更多Tasks
? 還是在框架中有一個更“慷慨的”調度程序而不實現自定義調度程序?
編輯:
添加ThreadPool.SetMinThreads(100, X)
似乎可以解決問題,我想等待釋放線程,以便池認為它可以啟動另一個線程,然后立即恢復。
默認情況下,最小線程數設置為系統上的處理器數。 您可以使用SetMinThreads方法來增加最小線程數。 但是,不必要地增加這些值可能會導致性能問題。 如果太多任務同時開始,則它們似乎都變慢了。 在大多數情況下,線程池使用自己的分配線程算法會更好地執行。 將最小值減少到少於處理器數量也會損害性能。
從這里: https : //msdn.microsoft.com/zh-cn/library/system.threading.threadpool.setminthreads(v=vs.110).aspx
我刪除了AsParallel
因為它AsParallel
,這似乎使讀者感到困惑。
有沒有一種方法可以強制調度程序在其他線程上啟動更多任務?
執行線程的數量不能超過CPU內核的數量。 這就是計算機的工作方式。 如果您使用更多的線程,那么您的工作實際上將更慢地完成,因為線程必須交換進出內核才能運行。
還是在框架中有一個更“慷慨的”調度程序而不實現自定義調度程序?
已經對PLINQ進行了調整,以充分利用硬件。
如果將Thread.Sleep
調用替換為實際使用CPU的東西(例如while (true) ;
),然后在任務管理器中查看CPU的使用情況,則可以自己查看。 我的期望是,本示例中PLINQ使用的7或8個線程是您的計算機可以處理的全部。
可以使用ThreadPool.SetMinThread
進行解釋的有用鏈接:
https://gist.github.com/JonCole/e65411214030f0d823cb#file-threadpool-md
試試這個: https : //msdn.microsoft.com/zh-cn/library/system.threading.threadpool.setmaxthreads(v=vs.110).aspx
您可以設置工作線程的數量(第一個參數)。
Enumerable.Range(0, 100).AsParallel().WithDegreeOfParallelism(x).Select(...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.