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

问题描述 投票:-4回答:1

我正在测试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是否正确?在我看来,并非如此,因为这个数字是恒定的。如何获得正确的信息?

go concurrency runtime runnable goroutine
1个回答
2
投票
我不建议使用这种方式(因为这是它在运行时内部的工作方式,以后可能会更改),但是出于测试目的,可以:https://play.golang.org/p/6gi26PF3iTT

如您所见,

运行中和可运行状态是不同的状态。

© www.soinside.com 2019 - 2024. All rights reserved.