gpt4 book ai didi

go - Go程序中的三个后台goroutine是什么?

转载 作者:IT王子 更新时间:2023-10-29 01:25:27 28 4
gpt4 key购买 nike

Go 似乎总是有至少 4 个 goroutines 在任何给定时间运行。另外三个不是主goroutine的是什么?

http://play.golang.org/p/MQBiLmHXBK

package main

import (
"fmt"
"runtime"
)

func main() {
fmt.Println(runtime.NumGoroutine()) //4
}

最佳答案

这些不是线程,它们是 goroutine,数量可能会根据当前的实现而有所不同(即在 go1.2 中它会打印 2)。

现在,看起来您有 1 个用于 main,3 个用于 runtime/gc。

import "fmt"

func main() {
fmt.Println(func() string { panic(nil); return "" }())
}

这表明

goroutine 16 [running]:
runtime.panic(0x0, 0x0)
/usr/local/go/src/pkg/runtime/panic.c:279 +0xf5
main.func·001(0x3ea4f, 0xdc4b0)
/test/threads.go:6 +0x28
main.main()
/test/threads.go:6 +0x1e

goroutine 17 [runnable]:
runtime.MHeap_Scavenger()
/usr/local/go/src/pkg/runtime/mheap.c:507
runtime.goexit()
/usr/local/go/src/pkg/runtime/proc.c:1445

goroutine 18 [runnable]:
bgsweep()
/usr/local/go/src/pkg/runtime/mgc0.c:1976
runtime.goexit()
/usr/local/go/src/pkg/runtime/proc.c:1445

goroutine 19 [runnable]:
runfinq()
/usr/local/go/src/pkg/runtime/mgc0.c:2606
runtime.goexit()
/usr/local/go/src/pkg/runtime/proc.c:1445

如果您删除 fmt,并使用引导 print 函数,您只会得到 2 个 goroutine。

import "runtime"

func main() {
print(runtime.NumGoroutine(), "\n")
}

// prints 2

如果您想确切了解正在运行的 goroutine,请打印堆栈跟踪、调用 panic 或使用 SIGQUIT 终止进程(它会打印堆栈跟踪并退出)。如果您运行绝对最小程序,您可以从中获得堆栈跟踪,您可以看到 2 个 goroutine:

package main

func main() {
panic(nil)
}

Goroutines 非常便宜,而且很多事情会启动和停止更多的 goroutines,所以试图跟踪它们的下限不是很有用。请注意,即使只有 2 个 goroutine(main/runtime.panic 和 runtime.MHeap_Scavenger),计数也已经达到 17。

panic: nil

goroutine 16 [running]:
runtime.panic(0x0, 0x0)
/usr/local/go/src/pkg/runtime/panic.c:279 +0xf5
main.main()
/test/threads.go:4 +0x28

goroutine 17 [runnable]:
runtime.MHeap_Scavenger()
/usr/local/go/src/pkg/runtime/mheap.c:507
runtime.goexit()
/usr/local/go/src/pkg/runtime/proc.c:1445
exit status 2

关于go - Go程序中的三个后台goroutine是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25747970/

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