zoukankan      html  css  js  c++  java
  • 获取 goroutineID

    本文转自鸟窝

    获取 goroutineID

    package main
    
    import (
    	"fmt"
    	"runtime"
    	"strconv"
    	"strings"
    	"sync"
    )
    
    func GoID() int {
    	var buf [64]byte
    	n := runtime.Stack(buf[:], false)
    	idField := strings.Fields(strings.TrimPrefix(string(buf[:n]), "goroutine "))[0]
    	id, err := strconv.Atoi(idField)
    	if err != nil {
    		panic(fmt.Sprintf("cannot get goroutine id: %v", err))
    	}
    	return id
    }
    
    func main() {
    	fmt.Println("main", GoID())
    	var wg sync.WaitGroup
    	for i := 0; i < 10; i++ {
    		i := i
    		wg.Add(1)
    		go func() {
    			defer wg.Done()
    			fmt.Println(i, GoID())
    		}()
    	}
    	wg.Wait()
    }
    

    它利用runtime.Stack的堆栈信息。runtime.Stack(buf []byte, all bool) int会将当前的堆栈信息写入到一个slice中,堆栈的第一行为goroutine #### […,其中####就是当前的gororutine id,通过这个花招就实现GoID方法了。

    但是需要注意的是,获取堆栈信息会影响性能,所以建议你在debug的时候才用它。

    Songzhibin
  • 相关阅读:
    5.5,5.6
    5.1,5.2
    第四章.编程练习
    多源最短路径--flody算法
    Java 面试题
    python 打包exe程序
    sql优化
    二叉树
    todo: 队列、栈、散列集
    java注解
  • 原文地址:https://www.cnblogs.com/binHome/p/14143559.html
Copyright © 2011-2022 走看看