In den Go-FAQ steht „Keine Goroutine-ID', aber wir können sie von runtime.Stack erhalten. Was ist es?

WBOY
Freigeben: 2024-02-05 22:51:03
nach vorne
602 Leute haben es durchsucht

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

Frageninhalt

Go FAQ beantwortet die Frage „Warum gibt es keine 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
Nach dem Login kopieren

Ich glaube nicht an die Erklärung „sie geben keine eindeutigen Bezeichner preis“, weil es so aussieht, als könnten wir die Goroutine-ID mithilfe von runtime.stack() erhalten.

Frage

  1. Was ist der Unterschied zwischen der „eindeutigen Kennung“ in der Go-FAQ-Antwort und der von runtime.stack extrahierten Goroutine-ID?

  2. Warum antwortet die Go-FAQ mit „Sie geben keine eindeutigen Kennungen preis“?

Ich möchte die Antwort „Warum keine Goroutine-ID?“ klar verstehen!

runtime.stack() scheint eine Goroutine-ID bereitzustellen. 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]))
}
Nach dem Login kopieren

Außerdem gibt es eine andere Möglichkeit, die Goroutine-ID über ebpf zu erhalten.

So erhalten Sie eine Goroutine-ID mit ebpf


Richtige Antwort


Was ist der Unterschied zwischen der „eindeutigen Kennung“ in den Go-FAQ und der von runtime.Stack extrahierten Goroutine-ID?

In den FAQ heißt es, dass Goroutinen Programmierern keine eindeutigen Bezeichner, Namen oder Datenstrukturen zugänglich machen.

Die Laufzeit benötigt zwar eine Möglichkeit, die Goroutine zu identifizieren, aber es gibt keine unterstützte Möglichkeit, diese Kennung zu erhalten.

Die Go-Dokumentation gibt weder das Format des von runtime.Stack zurückgegebenen Stack-Trace noch die Bedeutung der Goroutine-Nummern an. Der Code in der Frage ruft derzeit möglicherweise eindeutige IDs ab, es gibt jedoch keine Garantie dafür, dass der Code dies in Zukunft tun wird.

Das obige ist der detaillierte Inhalt vonIn den Go-FAQ steht „Keine Goroutine-ID', aber wir können sie von runtime.Stack erhalten. Was ist es?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage