我正在测试Go应用程序。现在,我正在获取一些信息,但是我想知道如何知道可运行状态的goroutines的确切数量(给定时间):NumGoroutine()
包的函数runtime
返回当前存在的goroutine的数量(比处于runnable状态的goroutine还要多!)。
这是我的功能,每秒打印goroutine号:
func count() {
for {
fmt.Println("Number of runnable goroutines: ", runtime.NumGoroutine())
time.Sleep(1 * time.Second)
}
}
不幸的是,结果不好(程序中的goroutine的数量一直在增长,我知道太多的goroutine无法同时处于活动状态!)。此页面:https://golang.org/doc/diagnostics.html表示debug.Stack
返回当前堆栈跟踪。堆栈跟踪对于查看当前正在运行多少个goroutine,它们在做什么以及是否被阻塞非常有用。
如果我打印debug.Stack()
(而不是runtime.NumGoroutine()),结果将完全更改(每秒它总是打印相同的堆栈!)。我的问题是:在[[runnable状态下len(debug.Stack())
的goroutine是否正确?在我看来,并非如此,因为这个数字是恒定的。如何获得正确的信息?
如您所见,
运行中和可运行状态是不同的状态。