gpt4 book ai didi

c# - TPL 强制更高的并行度

转载 作者:太空宇宙 更新时间:2023-11-03 21:02:24 25 4
gpt4 key购买 nike

Tasks 排队到 ThreadPool 时,代码依赖于默认的 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();

有没有办法强制调度程序在其他线程上启动更多任务?或者在框架中是否有一个更“慷慨”的调度器而无需实现自定义调度器?

编辑:

添加 ThreadPool.SetMinThreads(100, X) 似乎可以解决问题,我认为等待会释放线程,因此池认为它可以启动另一个线程,然后立即恢复。

By default, the minimum number of threads is set to the number of processors on a system. You can use the SetMinThreads method to increase the minimum number ofthreads. However, unnecessarily increasing these values can cause performance problems. If too many tasks start at the same time, all of them might appear to be slow. In most cases, the thread pool will perform better with its own algorithm for allocating threads. Reducing the minimum to less than the number of processors can also hurt performance.

来自这里:https://msdn.microsoft.com/en-us/library/system.threading.threadpool.setminthreads(v=vs.110).aspx

我删除了 AsParallel,因为它不相关,而且它似乎会让读者感到困惑。

最佳答案

Is there a way to force the scheduler to fire up more Tasks on other threads?

不能拥有比 CPU 内核更多的执行线程。这就是计算机的工作原理。如果您使用更多线程,那么您的工作实际上会更慢完成,因为线程必须换入和换出核心才能运行。

Or is there a more "generous" scheduler in the framework without implementing a custom one?

PLINQ 已经过优化,可以最大限度地利用硬件。

如果将 Thread.Sleep 调用替换为实际使用 CPU 的内容(例如,while (true) ;),您可以自己看到这一点,然后在任务管理器中观察您的 CPU 使用率。我的预期是本示例中 PLINQ 使用的 7 或 8 个线程是您的机器可以处理的所有线程。

关于c# - TPL 强制更高的并行度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44158703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com