我创建了一个简单的 Golang 应用程序:
func main() {
fmt.Println(runtime.NumGoroutine())
time.Sleep(2 * time.Minute)
}
这会记录一个 goroutine,这是主要的 goroutine。 如果我检查 Mac OS 活动监视器,它会显示 5 个线程正在运行(有时是 6 或 7 个)。
这些线程是什么?这些是用于 Go Scheduler、垃圾收集器等吗?
如果您能提供一些小解释或有用的链接,我将不胜感激。
Go 运行时使用多个系统线程来执行各种任务:
主线程:这是您的
main()
函数运行的线程。这也是默认调度 goroutine 的线程。
垃圾收集器(GC)线程:Go 使用并发垃圾收集器,这意味着它可以与您的程序并行运行。 GC 使用额外的线程来执行其工作。
调度程序线程:Go 运行时包含一个管理 goroutine 执行的调度程序。调度程序使用自己的线程来确保 goroutine 正确分布在可用的 CPU 上,并管理 goroutine 之间的上下文切换。
网络轮询器线程:Go 使用网络轮询器来处理 I/O 操作。网络轮询器使用自己的线程来有效管理多个网络连接。
cgo 调用的线程: 如果您的 Go 程序使用 cgo 调用 C 代码,则可能会创建额外的线程来处理这些调用。
线程的确切数量可能会有所不同,具体取决于程序的具体情况和您使用的 Go 运行时的版本。 Go 运行时尝试将线程数量限制为可用核心数量,但可以根据需要创建其他线程。