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
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
Was ist der Unterschied zwischen der „eindeutigen Kennung“ in der Go-FAQ-Antwort und der von runtime.stack extrahierten Goroutine-ID?
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])) }
Außerdem gibt es eine andere Möglichkeit, die Goroutine-ID über ebpf zu erhalten.
So erhalten Sie eine Goroutine-ID mit ebpf
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!