Maison > Article > développement back-end > Go FAQ dit 'Pas d'ID goroutine' mais nous pouvons l'obtenir à partir de runtime.Stack. qu'est-ce que c'est?
go faq répond à la question "Pourquoi n'y a-t-il pas d'identifiant goroutine ?"
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
Je ne crois pas à l'explication « ils n'exposent pas d'identifiants uniques » car il semble que nous puissions obtenir l'identifiant goroutine en utilisant runtime.stack().
Question
Quelle est la différence entre « l'identifiant unique » dans la réponse go faq et l'identifiant goroutine extrait par runtime.stack ?
Pourquoi la FAQ répond-elle « Ils n'exposent pas d'identifiants uniques » ?
Je veux comprendre clairement la réponse "Pourquoi n'y a-t-il pas d'identifiant goroutine ?"
runtime.stack() semble fournir l'identifiant goroutine. 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])) }
En outre, il existe un autre moyen d'obtenir l'identifiant goroutine via ebpf.
Comment obtenir l'identifiant goroutine en utilisant ebpf
Quelle est la différence entre "l'identifiant unique" dans la FAQ Go et l'identifiant goroutine extrait par runtime.Stack ?
La FAQ indique que les goroutines n'exposent pas d'identifiants, de noms ou de structures de données uniques aux programmeurs.
Le runtime a besoin d'un moyen d'identifier le Goroutine, mais il n'existe aucun moyen pris en charge pour obtenir cet identifiant.La documentation Go ne précise pas le format de la trace de pile renvoyée par runtime.Stack ni la signification des numéros goroutine. Le code dans la question peut récupérer des identifiants uniques maintenant, mais rien ne garantit que le code le fera à l'avenir.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!