如何统计处于可运行状态的goroutine数量
How to count the number of goroutine in runnable state
我正在测试我的 Go 应用程序。现在我得到了一些信息,但我想知道如何知道处于可运行状态 goroutines 的确切数量(给定某个时间点):函数 NumGoroutine()
runtime
包中 returns 当前存在的 goroutines 的数量(比 runnable 状态下的 goroutines 多得多!)。
这是我的函数,每秒打印 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
returns 当前堆栈跟踪。堆栈跟踪有助于查看当前有多少 goroutines 运行、它们在做什么以及它们是否被阻塞。
如果我打印 debug.Stack()
(而不是 runtime.NumGoroutine()),结果会完全改变(每一秒它总是打印相同的堆栈!)。我的问题是: len(debug.Stack())
处于 runnable 状态的 goroutines 的正确数量是多少?在我看来不是,因为这个数字是恒定的。
我如何获得正确的信息?
我不建议使用这种方式(因为这是它在运行时的工作方式,将来可能会更改),但出于测试目的会很好:
https://play.golang.org/p/6gi26PF3iTT
如您所见,运行和runnable状态是不同的状态。
我正在测试我的 Go 应用程序。现在我得到了一些信息,但我想知道如何知道处于可运行状态 goroutines 的确切数量(给定某个时间点):函数 NumGoroutine()
runtime
包中 returns 当前存在的 goroutines 的数量(比 runnable 状态下的 goroutines 多得多!)。
这是我的函数,每秒打印 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
returns 当前堆栈跟踪。堆栈跟踪有助于查看当前有多少 goroutines 运行、它们在做什么以及它们是否被阻塞。
如果我打印 debug.Stack()
(而不是 runtime.NumGoroutine()),结果会完全改变(每一秒它总是打印相同的堆栈!)。我的问题是: len(debug.Stack())
处于 runnable 状态的 goroutines 的正确数量是多少?在我看来不是,因为这个数字是恒定的。
我如何获得正确的信息?
我不建议使用这种方式(因为这是它在运行时的工作方式,将来可能会更改),但出于测试目的会很好: https://play.golang.org/p/6gi26PF3iTT
如您所见,运行和runnable状态是不同的状态。