Goroutine是Golang中轻量级线程的实现,由Go Runtime管理。Golang在语言级别支持轻量级线程,叫做协程。Golang标准库提供的所有系统调用操作,都会出让CPU给其他Goroutine。这让事情变得非常简单,让轻量级线程的切换管理不依赖于系统的线程和进程,也不依赖于CPU的核心数量。
Goroutine非常亮眼,但是自从go1.4版本以后,GoroutineId无法直接从Go Runtime获取了。这是Golang的开发者故意为之,避免开发者滥用Goroutine Id实现Goroutine Local Storage,因为Goroutine Local Storage很难进行垃圾回收。
既有的几种方法
通过汇编获取
复杂度高,便宜地址随版本可能有变化,不建议使用
通过第三方库获取
相关第三方库可以在github上找,比如:
https://github.com/jtolds/gls
https://github.com/huandu/goroutine
稳定性未知,性能也不高,不建议使用
通过runtime.Stack获取
它利用runtime.Stack的堆栈信息,将当前的堆栈信息写入到一个slice中,堆栈的第一行为"goroutine ###[...",其中"###"就是当前的Goroutine Id,通过这个方法就可以实现Goid函数了。
Goid函数的实现如下: