在 Go 语言中,有哪些方法可以获取当前程序中 goroutine 的数量?请给出具体的实现方式。
考察说明
考察对 Go 运行时内存布局和调试手段的理解。
回答思路
- 【回答框架 1】通过 runtime.NumGoroutine() 函数可以直接返回当前程序中所有 goroutine 的数量,包括正在运行和阻塞的。
- 【回答框架 2】另一种方式是通过 pprof 接口获取,在程序中导入 net/http/pprof 后,访问 /debug/pprof/ 页面可以看到 goroutine 的堆栈信息,包括数量。
- 【回答框架 3】也可以通过 runtime/pprof 包,调用 pprof.Lookup("goroutine") 获取 Profile 对象,然后用 WriteTo 方法将信息写入文件,再通过 go tool pprof 分析。
- 【关键点 1】runtime.NumGoroutine() 是最直接的 API。
- 【关键点 2】pprof 可以提供更详细的 goroutine 堆栈信息。
- 【关键点 3】在生产环境中,可利用 pprof 进行性能分析。
- 【易错点 1】NumGoroutine() 返回的是瞬时数量,可能随时变化。
- 【易错点 2】不能依赖 goroutine 数量来推断资源泄漏,需要结合堆栈和业务逻辑分析。