Go运行时使用的线程数

fum*_*007 9 concurrency multithreading go goroutine docker

Go运行时(调度程序,垃圾收集器等)可以使用多少个线程?例如,如果GOMAXPROCS10,那么运行时将使用多少个内核线程?

编辑:

我读的理由改变GOMAXPROCSruntime.NumCPU()围棋1.5.有一句话声称"单个goroutine程序的性能可以通过提高GOMAXPROCS运行时的并行性来提高,特别是垃圾收集器."

我真正的问题是:如果我在具有CPU配额的Docker容器中运行单goroutine程序,那么为了获得最大性能,我需要的逻辑处理器的最小数量是多少.

icz*_*cza 10

没有直接关联.您的应用使用的主题可能小于,等于或大于10.

引用包文档runtime:

GOMAXPROCS变量限制了可以同时执行用户级Go代码的操作系统线程数.代表Go代码在系统调用中可以阻塞的线程数没有限制; 那些不计入GOMAXPROCS限制.该软件包的GOMAXPROCS函数查询并更改限制.

因此,如果您的应用程序没有启动任何新的goroutine,则线程数将小于10.

如果您的应用程序启动了许多goroutine(> 10),其中没有任何阻塞(例如在系统调用中),10个操作系统线程将同时执行您的goroutines.

如果您的应用程序启动了许多goroutine,其中许多(> 10)在系统调用中被阻止,则将生成超过10个OS线程(但最多只有10个将执行用户级Go代码).

有关示例和详细信息,请参阅此问题:为什么在golang中写入文件时阻止了许多goroutine时,它不会创建多个线程?

编辑(响应您的编辑):

我认为默认值GOMAXPROCS是逻辑CPU的数量有一个原因:因为通常提供最高性能.你可以留下它.一般来说,如果你只有1个goroutine并且你确定你的代码不会产生更多,GOMAXPROCS=1那就足够了,但是你应该测试并且不要对它采取任何措辞.

  • “如果你的应用程序启动了许多 goroutine,其中许多(> 10 个)在系统调用中被阻塞,则会产生超过 10 个操作系统线程(但最多只有 10 个将执行用户级 Go 代码)。”这是否意味着我的代码正在执行大量 IO(比如 1000 个),我可能有 1000 个线程?在这种情况下,我的代码是否会遇到诸如内存不足之类的问题,即无法像其他语言那样生成更多线程? (4认同)
  • @AbhishekArya 是的,但是执行数千个并发 IO 操作是一个糟糕的设计。使用工作池有效地执行并发操作。 (4认同)