这些不是线程,它们是 goroutine,并且数量可能会根据当前实现而变化(即在 go1.2 中会打印 2)。
现在,您似乎有 1 个main
,3 表示运行时/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,请打印堆栈跟踪、调用恐慌或使用 SIGQUIT 终止进程(它会打印堆栈跟踪并退出)。如果您运行绝对最小的程序,您可以获得堆栈跟踪,您可以看到 2 个 goroutine:
package main
func main() {
panic(nil)
}
Goroutines 非常便宜,并且many事情会启动和停止更多的 goroutine,因此尝试跟踪它们的下限并不是很有用。请注意,尽管只有 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