簡體   English   中英

TPL要求更高的並行度

[英]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

您可以設置工作線程的數量(第一個參數)。

使用WithDegreeOfParallelism擴展:

Enumerable.Range(0, 100).AsParallel().WithDegreeOfParallelism(x).Select(...

暫無
暫無

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

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