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

WBOY
Release: 2024-02-05 22:51:03
forward
598 people have browsed it

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
Copy after login

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]))
}
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template