最小线程池个数是CPU
的核心数,最大线程池个数是32767
。dotnet
生成新线程的规则是,当有新任务需要线程时,先在线程池中找空闲线程,如果没有空闲,就等待500ms
看是否有线程空闲出来,如果还是没有,产生一个新线程。
当程序启动后一下子来了1000个并发请求会怎样?
@dudu: 刚开始工作线程肯定是不够用,会开始创建大量的新线程,最后具体会创建多少个新线程,应该看各个请求的处理速度了。可以通过 ThreadPool.GetMaxThreads
减去ThreadPool.GetAvailable
的值打印出当前的工作线程数。
通过下面的 Startup 中的代码验证了,线程池默认最小线程数的确是 CPU 的核心数
ThreadPool.GetMinThreads(out var workThreads, out var completionPortThreads);
logger.LogInformation(new StringBuilder()
.Append($"ThreadPool.ThreadCount: {ThreadPool.ThreadCount}, ")
.Append($"Minimum work threads: {workThreads}, ")
.Append($"Minimum completion port threads: {completionPortThreads})").ToString());
在4核8G服务器上运行的输出是
ThreadPool.ThreadCount: 4, Minimum work threads: 4, Minimum completion port threads: 4