在Golang中,堆栈跟踪中显示的goroutine编号是否会被重用或递增?

3
我找不到有关goroutine“numbers”在堆栈跟踪中确切含义的信息。谷歌搜索会出现一些关于解释堆栈跟踪文章的参考资料,这些资料似乎表明数字是可重复使用的,但我找不到任何明确的问题和答案。
在Go堆栈跟踪中显示的数字是否被重用或递增?如果我看到一个很大的数字,那么是否意味着至少有那么多个goroutine当前存在?
例如,考虑以下堆栈跟踪:
goroutine 127590 [running]:
crypto/sha256.(*digest).checkSum(0xc042bb57d8, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/crypto/sha256/sha256.go:247 +0x26d

这是否意味着当前有127590个goroutine正在运行?
1个回答

3
如果国王被命名为亨利八世,这是否意味着亨利一到七仍然活着?这些只是数字,用于区分彼此。
这是goroutine的id。您不能得出它是存活的goroutine数量。它类似于操作系统中的进程id。这些id是cached的,有些可能没有使用。
要查看goroutine id如何生成,请在Go源代码中搜索goidgen
在Linux中,只有进程0是特殊的,在Go中只有goroutine 1(主要)是特殊的。
请参见为什么没有goroutine ID?
《Goroutines(协程)》没有名称,它们只是匿名的工作者。程序员无法访问或控制其唯一标识符、名称或数据结构。一些人对此表示惊讶,期望go语句返回一个可用于稍后访问和控制goroutine的项。

我有一个包,它为使用该包中的API启动的goroutine提供了唯一的ID。如果您感兴趣,可以访问github.com/jwells131313/goethe。此外,该包还提供了一些很好的工具,如线程本地存储等。 - jwells131313
根据src/runtime/proc.go中的Go代码,"cache"实际上充当了每个" P "或"处理器"的goroutine ID("goid")的"批量分配器"。每个P获取一批16个goids,然后根据需要将它们分配以创建新的"G" goroutine。因此,并非所有的goids都可能被使用,因为这取决于P和创建新G的goids批次。但是,除非您成功创建2 ** 64个goroutine,使调度程序的"master" goid计数器环绕,否则goids不会被重用。 - TheDiveO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接