Maison > développement back-end > Golang > le corps du texte

Go FAQ dit 'Pas d'ID goroutine' mais nous pouvons l'obtenir à partir de runtime.Stack. qu'est-ce que c'est?

WBOY
Libérer: 2024-02-05 22:51:03
avant
560 Les gens l'ont consulté

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
Copier après la connexion

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]))
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!