Home  >  Article  >  Backend Development  >  Go FAQ says "No goroutine ID" but we can get it from runtime.Stack. what is it?

Go FAQ says "No goroutine ID" but we can get it from runtime.Stack. what is it?

WBOY
WBOYforward
2024-02-05 22:51:03549browse

Go常见问题解答说“没有goroutine ID”,但我们可以从runtime.Stack中获取它。它是什么?

Question content

go faq answered the question "Why is there no goroutine id?"

goroutines do not have names; they are just anonymous workers. they expose no unique identifier, name, or data structure to the programmer.
https://go.dev/doc/faq#no_goroutine_id

I don't believe the "they don't expose unique identifiers" explanation, because it looks like we can get the goroutine id by using runtime.stack().

question

  1. go faq What is the difference between the "unique identifier" in the answer and the goroutine id extracted by runtime.stack?

  2. Why does go faq answer "They don't expose unique identifiers"?

I want to clearly understand the "Why is there no goroutine id?" answer!

runtime.stack() seems to provide the goroutine id. https://go.dev/play/p/5b6fd7c8s6-

package main

import (
    "bytes"
    "errors"
    "fmt"
    "runtime"
    "strconv"
)

func main() {
    fmt.Println(goid())

    done := make(chan struct{})
    go func() {
        fmt.Println(goid())
        done <- struct{}{}
    }()
    go func() {
        fmt.Println(goid())
        done <- struct{}{}
    }()
    <-done
    <-done
    close(done)
}

var (
    goroutinePrefix = []byte("goroutine ")
    errBadStack     = errors.New("invalid runtime.Stack output")
)

func goid() (int, error) {
    buf := make([]byte, 32)
    n := runtime.Stack(buf, false)
    buf = buf[:n]
    // goroutine 1 [running]: ...

    buf, ok := bytes.CutPrefix(buf, goroutinePrefix)
    if !ok {
        return 0, errBadStack
    }

    i := bytes.IndexByte(buf, ' ')
    if i < 0 {
        return 0, errBadStack
    }

    return strconv.Atoi(string(buf[:i]))
}

Also, there is another way to get the goroutine id through ebpf.

How to get goroutine id using ebpf


Correct answer


What is the "unique identifier" in Go FAQ and the goroutine id extracted by runtime.Stack the difference?

The FAQ states that goroutines do not expose unique identifiers, names, or data structures to programmers .

The runtime does need a way to identify the Goroutine, but there is no supported way to obtain that identifier.

The Go documentation does not specify the format of the stack trace returned by runtime.Stack or the meaning of the goroutine numbers. The code in the question may retrieve a unique id now, but there is no guarantee that the code will do so in the future.

The above is the detailed content of Go FAQ says "No goroutine ID" but we can get it from runtime.Stack. what is it?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete