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 dit "Pas d'ID goroutine" mais nous pouvons l'obtenir à partir de runtime.Stack. qu'est-ce que c'est?

WBOY
WBOYavant
2024-02-05 22:51:03549parcourir

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

Contenu de la question

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

  1. Quelle est la différence entre « l'identifiant unique » dans la réponse go faq et l'identifiant goroutine extrait par runtime.stack ?

  2. 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


Réponse correcte


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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer