获取 协程 ID

半城伤御伤魂 提交于 2019-12-02 19:28:23

在go语言中,谷歌开发者不建议大家获取协程ID,主要是为了GC更好的工作,滥用协程ID会导致GC不能及时回收内存
golang从1.4版以后就删去了获取协程ID的接口,但有时为调试方便,还是希望能获取打印出来
本文介绍的方法是使用runtime.Stack函数从堆栈中取出信息分析,截取出协程ID

func GetGoroutineID() uint64 {
	b := make([]byte, 64)
	runtime.Stack(b, false)
	b = bytes.TrimPrefix(b, []byte("goroutine "))
	b = b[:bytes.IndexByte(b, ' ')]
	n, _ := strconv.ParseUint(string(b), 10, 64)
	return n
}

  

分析:
首先rumtime.Stack(b,false)会取出堆栈信息类似放入b中,堆栈信息类似:

goroutine 1 [running]:
main.main()
C:/Users/zuma/Desktop/gowork/src/github.com/0990/gotool/main.go:10 +0x74

然后从第一行中取出goroutine后面的数字 1即代表这个协程的ID

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!