gpt4 book ai didi

c# - Task.Run 如何受 CPU 内核限制?

转载 作者:行者123 更新时间:2023-12-02 08:40:30 27 4
gpt4 key购买 nike

为什么下面的程序只会运行有限数量的阻塞任​​务。限制数量似乎是机器上的核心数量。

最初,当我写这篇文章时,我希望看到以下内容:

  • 作业 1 - 24 的作业完整输出
  • 2 秒的间隙
  • 就业岗位产出 25 - 48

但是输出是:

  • 作业 1 - 4 的作业完整输出
  • 然后每隔 100 毫秒随机完成一次作业。

当在32核服务器上运行时,程序确实按照我的预期运行了。

class Program
{
private static object _lock = new object();
static void Main(string[] args)
{
int completeJobs = 1;
var limiter = new MyThreadLimiter();
for (int iii = 1; iii < 100000000; iii++)
{
var jobId = iii;
limiter.Schedule()
.ContinueWith(t =>
{
lock (_lock)
{
completeJobs++;
Console.WriteLine("Job: " + completeJobs + " scheduled");
}
});
}

Console.ReadLine();
}
}

class MyThreadLimiter
{
readonly SemaphoreSlim _semaphore = new SemaphoreSlim(24);

public async Task Schedule()
{
await _semaphore.WaitAsync();

Task.Run(() => Thread.Sleep(2000))
.ContinueWith(t => _semaphore.Release());
}
}

但是,用 Task.Delay 替换 Thread.Sleep 可以得到我预期的结果。

    public async Task Schedule()
{
await _semaphore.WaitAsync();

Task.Delay(2000)
.ContinueWith(t => _semaphore.Release());
}

使用Thread给出了我预期的结果

    public async Task Schedule()
{
await _semaphore.WaitAsync();

var thread = new Thread(() =>
{
Thread.Sleep(2000);
_semaphore.Release();
});
thread.Start();
}

Task.Run() 是如何工作的?是不是有核数限制?

最佳答案

Task.Run 安排工作在线程池中运行。线程池被赋予了很大的自由度来尽可能地安排工作,以最大化吞吐量。当它认为额外的线程有帮助时,它会创建它们;当它认为它无法为它们提供足够的工作时,它会从池中删除线程。

当您的工作受 CPU 限制时,创建多于处理器能够同时运行的线程不会提高效率。添加更多线程只会导致更多的上下文切换,增加开销并降低吞吐量。

关于c# - Task.Run 如何受 CPU 内核限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42277862/

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