如何计算处于可运行状态的 goroutine 的数量

我正在测试我的 Go 应用程序。现在我正在获取一些信息,但我想知道如何知道处于可运行状态的 goroutinesNumGoroutine()的确切数量(给定某个时间点):包的函数runtime返回当前存在的 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 返回当前堆栈跟踪。堆栈跟踪有助于查看当前正在运行的 goroutine 数量、它们在做什么以及它们是否被阻塞。


如果我打印debug.Stack()(而不是 runtime.NumGoroutine()),结果会完全改变(每秒它总是打印相同的堆栈!)。我的问题是:处于可运行len(debug.Stack())状态的 goroutine 数量是否正确?在我看来不是,因为这个数字是恒定的。我如何获得正确的信息?


开满天机
浏览 122回答 1
1回答

互换的青春

我不建议使用这种方式(因为这就是它在运行时内部的工作方式,并且将来可能会更改),但在测试目的中会很好: https: //play.golang.org/p/6gi26PF3iTT如您所见,运行状态和可运行状态是不同的状态。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go