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

Le comportement d'un canal Go change-t-il en fonction de la manière dont les messages lui sont envoyés ?

WBOY
Libérer: 2024-02-09 10:39:20
avant
763 Les gens l'ont consulté

go 通道的行为是否会根据消息发送到它的方式而改变?

éditeur php Xiaoxin Dans le langage Go, un canal est un mécanisme utilisé pour transférer des données entre goroutines. Le comportement d'un canal dépend de la manière dont les messages lui sont envoyés. Lorsqu'un canal est déclaré mis en mémoire tampon, la goroutine qui envoie le message placera le message dans le tampon du canal puis poursuivra l'exécution. Lorsque le canal est déclaré sans tampon, la goroutine qui envoie le message se bloquera jusqu'à ce qu'une autre goroutine reçoive le message du canal. On peut donc dire que le comportement d’un canal change en fonction de la manière dont les messages lui sont envoyés.

Contenu de la question

Pourquoi ces deux morceaux de code s'exécutent-ils différemment ?

  1. L'exécution du code suivant renverra fatal 错误:所有 goroutine 都在休眠 - 死锁!erreur.
func main() {
    ch := make(chan int)
    ch <- 1
    fmt.println(<-ch)
}
Copier après la connexion
  • L'exécution correcte du code suivant renverra 2 et 3 (une ligne chacun).
  • ch := make(chan int)
        go buffer(ch)
        fmt.Println(<-ch)
        fmt.Println(<-ch)
    }
    
    func buffer(ch chan int) {
        ch <- 2
        ch <- 3
    }
    Copier après la connexion

    #1 ne fonctionne correctement que si ch est défini comme un canal tamponné. Pourquoi? Pourquoi buffer() dans ch accepte-t-il 2 valeurs sans se plaindre ?

    Solution de contournement

    Les opérations d'envoi sur les canaux sans tampon seront bloquées jusqu'à ce qu'un autre goroutine en lise les données. C'est pourquoi le premier morceau de code se bloque : lorsque vous envoyez au canal, aucune autre goroutine ne le lit.

    Dans le deuxième cas, vous avez une goroutine qui envoie deux valeurs au canal, et la goroutine principale lit deux fois le canal pendant l'envoi. Le canal n'accepte pas deux envois, mais l'un après l'autre, le premier envoi étant débloqué par la première lecture et le deuxième envoi débloqué par la deuxième lecture.

    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!

    Étiquettes associées:
    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!