[英]What are the three background goroutines in a Go program?
Go似乎总是在任何给定时间运行至少4个goroutines。 还有哪三个不是主要的goroutine?
http://play.golang.org/p/MQBiLmHXBK
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println(runtime.NumGoroutine()) //4
}
那些不是线程,它们是goroutines,并且数量可能根据当前的实现而变化(即在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,并使用bootstrapping print
功能,你只能获得2个goroutines。
import "runtime"
func main() {
print(runtime.NumGoroutine(), "\n")
}
// prints 2
如果你想知道goroutine正在运行什么,打印堆栈跟踪,调用恐慌,或使用SIGQUIT(打印堆栈跟踪并退出)终止进程。 如果您运行绝对最小程序,您可以从中获得堆栈跟踪,您可以看到2个goroutines:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.