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

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

欢迎关注,学习不迷路!

相关文章:

  • [深度学习]卷积神经网络的概念,入门构建(代码实例)
  • 算法笔记-第十章-动态规划2
  • 安全领航,共筑敏捷开发新时代【云驻共创】
  • 六边形架构
  • 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接
  • zookeperkafka学习
  • Golang Context 的并发安全性探究
  • RFID电网资产全寿命周期管理解决方案
  • html实现计算器源码
  • redis的一些操作
  • 4、FFmpeg命令行操作7
  • kibana 7安装
  • 【Java】java | CacheManager | redisCacheManager
  • 机器学习技术栈—— 概率学基础
  • spring注解
  • CSDN流量卷领取和使用保姆级教程——流量卷,恭喜获得每日任务奖励【1500曝光】可获得新增曝光,阅读转化,点赞转化,新增关注-流量卷,流量卷,流量卷
  • 19.删除链表的倒数第 N 个节点
  • 听GPT 讲Rust源代码--src/librustdoc(2)
  • Python Turtle Graphics 绘制I Love You字符
  • easyExcel实现分批导入,动态表头分批导出,以及导出表格样式设置
  • 日本航空自卫队一架练习机在爱知县坠毁
  • 多条跨境铁路加速推进,谁是下一个“超级枢纽”?
  • 人民币对美元即期汇率盘中创半年新高,离岸市场升破7.2
  • 浙江公开征集涉企行政执法问题线索,包括乱收费、乱罚款等
  • 专访|日本驻华大使金杉宪治:对美、对华外交必须在保持平衡的基础上稳步推进
  • 牛市早报|中美经贸高层会谈达成重要共识,取得实质性进展