如何统计处于可运行状态的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状态是不同的状态。