这些不是线程,它们是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 +0xf5main.func·001(0x3ea4f, 0xdc4b0) /test/threads.go:6 +0x28main.main() /test/threads.go:6 +0x1egoroutine 17 [runnable]:runtime.MHeap_Scavenger() /usr/local/go/src/pkg/runtime/mheap.c:507runtime.goexit() /usr/local/go/src/pkg/runtime/proc.c:1445goroutine 18 [runnable]:bgsweep() /usr/local/go/src/pkg/runtime/mgc0.c:1976runtime.goexit() /usr/local/go/src/pkg/runtime/proc.c:1445goroutine 19 [runnable]:runfinq() /usr/local/go/src/pkg/runtime/mgc0.c:2606runtime.goexit() /usr/local/go/src/pkg/runtime/proc.c:1445
如果删除fmt,并使用自举
import "runtime"func main() { print(runtime.NumGoroutine(), "n")}// prints 2如果您想确切地知道正在运行的goroutine,请打印堆栈跟踪,调用panic或使用SIGQUIT终止进程(该进程将打印堆栈跟踪并退出)。如果运行绝对最小程序,则可以从中获得堆栈跟踪,可以看到2个goroutine:
package mainfunc main() { panic(nil)}Goroutine非常便宜, 许多
事情将启动和停止更多Goroutine,因此尝试跟踪其下限不是很有用。请注意,即使只有两个goroutines(main /
runtime.panic和runtime.MHeap_Scavenger),计数却已经达到17。
panic: nilgoroutine 16 [running]:runtime.panic(0x0, 0x0) /usr/local/go/src/pkg/runtime/panic.c:279 +0xf5main.main() /test/threads.go:4 +0x28goroutine 17 [runnable]:runtime.MHeap_Scavenger() /usr/local/go/src/pkg/runtime/mheap.c:507runtime.goexit() /usr/local/go/src/pkg/runtime/proc.c:1445exit status 2



