当前位置: 首页 > article >正文

Go语言中获取协程ID

简介

java同事都知道,线程会有对应的id,那么go语言中协程有id吗,其实是有的,但是不建议使用。

实在需要使用的话可以使用本文的例子获取

stack

我们先看一下runtime.Stack打印出来的栈结构,其中就包括了协程id

func main() {
	b := make([]byte, 64)
	b = b[:runtime.Stack(b, false)]
	fmt.Println(string(b))
}

goroutine 1 [running]:
main.main()
    /Users/shura/GolandProject

通过上面可以看出 1 就是需要的协程id

获取协程id

根据以上的结构,我们就可以截取到协程id

func main() {
	fmt.Println(GoID())
}

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


输出 1

优化

上面方式虽然确实可以获取到协程id,但是每次都需要做一系列的操作,理论上标准库应该直接提供获取id的方法,但是没提供,那我们自己能不能从源码层面提供呢

我们跟踪runtime.Stack方法进入源码可以看到协程的信息是由 gp := getg()获取到的

再进入getg()查看是一个g的结构体

type g struct {
    goid         int64
}

这里面就有一个关键的属性goid,但是由于是私有的我们获取不到,所以我们只能从源码层面去添加获取协程id的方法

找到该go文件的路径,例如/Users/shura/support/go/go/src/runtime,执行如下脚本

cat > /Users/shura/support/go/go/src/runtime/shura_goid.go << EOF
package runtime

func GoID() int64{
    return getg().goid
}
EOF

测试

func main() {
	fmt.Println(runtime.GoID())
	fmt.Println(GoID())
}

输出

1
1

欢迎关注,学习不迷路!


http://www.kler.cn/news/137015.html

相关文章:

  • C++侯捷内存管理课程学习笔记汇总
  • 简单介绍冯诺依曼体系
  • [Vue3核心语法] setup语法糖
  • 活体人脸识别技术总结及实践
  • WebGl 实现图片平移、缩放和旋转
  • 若依框架的下载与配置
  • Golang抓包:实现网络数据包捕获与分析
  • 后端接口测试,令牌校验住,获取tocken 接口的方式
  • centos更换yum源
  • uni-app(1)pages. json和tabBar
  • 如果文件已经存在与git本地库中,配置gitignore能否将其从git库中删除
  • 【python学习】基础篇-常用函数-sorted() 对可迭代对象进行排序
  • 黄鹤楼
  • 大数据研发工程师课前环境搭建
  • java获取shp文件坐标系
  • 计算机类编程课学生编写的代码应该如何管理
  • 一个完备的手游地形实现方案
  • “三面一体”的业务调度方案在运营商订单运营的实践
  • 一个美观且功能丰富的 .NET 控制台应用程序开源库
  • 报错!Jupyter notebook 500 : Internal Server Error
  • hologres 索引与查询优化
  • MFC项目添加CUDA支持
  • leetcode:914. 卡牌分组(python3解法)
  • 如何快速让苹果TF上架
  • 安卓毕业设计:基于安卓android微信小程序的超市购物系统
  • CSDN每日一题学习训练——Python版(N皇后 II、买卖股票的最佳时机 II、编程通过键盘输入每一位运动员)