gpt4 book ai didi

multithreading - Go 运行时使用的线程数

转载 作者:IT老高 更新时间:2023-10-28 21:37:12 25 4
gpt4 key购买 nike

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

编辑:

我正在阅读 the rationale用于在 Go 1.5 中将 GOMAXPROCS 更改为 runtime.NumCPU()。有句话声称“由于运行时的并行性,尤其是垃圾收集器的并行性,可以通过提高 GOMAXPROCS 来提高单 goroutine 程序的性能。”

我真正的问题是:如果我有一个在具有 CPU 配额的 Docker 容器中运行的单协程程序,我需要多少逻辑处理器才能获得最大性能?

最佳答案

没有直接的相关性。您的应用使用的线程数可能少于、等于或多于 10 个。

引用 runtime 的包文档:

The GOMAXPROCS variable limits the number of operating system threads that can execute user-level Go code simultaneously. There is no limit to the number of threads that can be blocked in system calls on behalf of Go code; those do not count against the GOMAXPROCS limit. This package's GOMAXPROCS function queries and changes the limit.

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

如果您的应用启动了许多 goroutine (>10),其中没有一个是阻塞的(例如在系统调用中),那么 10 个操作系统线程将同时执行您的 goroutine。

如果您的应用启动许多 goroutine,其中许多 (>10) 在系统调用中被阻塞,则会产生超过 10 个操作系统线程(但最多只有 10 个会执行用户级 Go 代码)。

有关示例和详细信息,请参阅此问题:Why does it not create many threads when many goroutines are blocked in writing file in golang?

编辑(响应您的编辑):

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

关于multithreading - Go 运行时使用的线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39245660/

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