Golang App 多个系统线程的目的是什么?

问题描述 投票:0回答:1

我创建了一个简单的 Golang 应用程序:

func main() {
    fmt.Println(runtime.NumGoroutine())
    time.Sleep(2 * time.Minute)
}

这会记录一个 goroutine,这是主要的 goroutine。 如果我检查 Mac OS 活动监视器,它会显示 5 个线程正在运行(有时是 6 或 7 个)。

这些线程是什么?这些是用于 Go Scheduler、垃圾收集器等吗?

如果您能提供一些小解释或有用的链接,我将不胜感激。

go
1个回答
0
投票

Go 运行时使用多个系统线程来执行各种任务:

  1. 主线程:这是您的

    main()
    函数运行的线程。这也是默认调度 goroutine 的线程。

  2. 垃圾收集器(GC)线程:Go 使用并发垃圾收集器,这意味着它可以与您的程序并行运行。 GC 使用额外的线程来执行其工作。

  3. 调度程序线程:Go 运行时包含一个管理 goroutine 执行的调度程序。调度程序使用自己的线程来确保 goroutine 正确分布在可用的 CPU 上,并管理 goroutine 之间的上下文切换。

  4. 网络轮询器线程:Go 使用网络轮询器来处理 I/O 操作。网络轮询器使用自己的线程来有效管理多个网络连接。

  5. cgo 调用的线程: 如果您的 Go 程序使用 cgo 调用 C 代码,则可能会创建额外的线程来处理这些调用。

线程的确切数量可能会有所不同,具体取决于程序的具体情况和您使用的 Go 运行时的版本。 Go 运行时尝试将线程数量限制为可用核心数量,但可以根据需要创建其他线程。

© www.soinside.com 2019 - 2024. All rights reserved.