首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

『GCTT 出品』获取 Goroutine ID

首发于:https://studygolang.com/articles/12133

Goroutine ID 真实存在吗?

当然存在。

Go 运行时一定有某种方法来跟踪 goroutine ID。

那我该使用它们吗?

不该。

原因一:https://groups.google.com/forum/#!topic/golang-nuts/Nt0hVV_nqHE

原因二:https://groups.google.com/forum/#!topic/golang-nuts/0HGyCOrhuuI

原因三:http://stackoverflow.com/questions/19115273/looking-for-a-call-or-thread-id-to-use-for-logging

有没有哪些包是我可以使用的?

已有的来自 Go Team 成员的包,被评价为“用此包者,将入地狱。”

也有一些包基于 goroutine id 来建立 goroutine 本地存储,如:

github.com/jtolds/gls

github.com/tylerb/gls

但都有悖于 Go 语言的设计原则。

最简代码

如果读到这里,你仍“执迷不悟”,那么下面就将展示如何获取当前的 goroutine id :

Go 源码中的骇客(Hacky)代码

下列代码源于 Brad Fitzpatrick 的 库。它被整合进了 Go 1.6 中,仅仅被用于调试而非常规开发。

工作原理解释

通过解析调试信息来获取 goroutine id 是可行的. 库就使用调试性的代码来对连接进行追踪查看。但仅仅是将 goroutine id 用于调试而已。

调试信息可以通过调用 来获取,它会以文本形式打印堆栈信息到缓冲区中。堆栈信息的第一行会是如下文本: “goroutine #### […” 。这里的 #### 就是真实的 goroutine id。剩余代码不过是进行一些文本操作来提取和解析堆栈信息中的数字。

CGo 版本对应的合法代码

C 版本的代码来自 github.com/davecheney/junk/id。代码中直接获取了当前 goroutine 的 goid 属性并返回它的值。

文件

文件

我该怎么做?

远离 goroutine id 吧,并忘记它们的存在。从 Go 语言设计的角度来看,使用它们是危险的。因为几乎所有使用的目的都是去做一些和 goroutine-local 相关的事情。而这违反了 Go 语言编程的 “Share Memory By Communicating” 原则。

via: http://blog.sgmansfield.com/2015/12/goroutine-ids/

作者:Scott Mansfield

译者:MaleicAcid

校对:polaris1119

本文由 GCTT 原创编译,Go 中文网 荣誉推出

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180211G06K8400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券