为什么没有goroutine id

对于从Java、C之类转到Go的程序员而言,获取线程id是一件自然而然的事情,但是在Go里面却不一样,那么为什么goroutine没有id呢?

以下是我搜罗到的没有goroutine id的主要观点

  • 一旦开发者命名了一个goroutine并围绕建立模型,那么该goroutine就会变得极为特殊,而忽略了多个goroutine共同处理的可能性

  • 防止线程本地储存被滥用。

    • 新goroutine突然无法访问父goroutine的本地储存,这可能会引起问题。你可以保证你自己的代码不会产生其他的程序, 但一般来说,你不能确保标准库或任何第三方代码不会这样做

      一个典型的例子是图形库,它要求所有操作都在“主线程”上执行,因为这是一些库在TLS中隐藏其状态的地方,如果从任何其他线程调用,就会崩溃。

    • 当goroutine消失时,本地储存并不会被gc(可以得到当前运行的goroutine id,但无法列出所有运行的id)

显然这些理由都非常符合go一向的风格,直接从语法规范上杜绝了一些既可以这样又可以那样的情况。

Ref

  1. https://github.com/golang/go/issues/22770
  2. https://go.dev/doc/faq#no_goroutine_id
  3. https://groups.google.com/g/golang-nuts/c/Nt0hVV_nqHE

你可能感兴趣的:(哲学与架构,lang,golang)