Maison >développement back-end >Golang >Comment les Goroutines se comportent-elles différemment entre Go Playground et Local Machine ?

Comment les Goroutines se comportent-elles différemment entre Go Playground et Local Machine ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-23 17:42:24531parcourir

How Do Goroutines Behave Differently Between Go Playground and Local Machine?

Différences entre Go Playground et Go sur ma machine locale

Problème : Goroutines dans Go Playground par rapport à la machine locale

Pour clarifier les malentendus sur les goroutines, ce code a été exécuté dans Go Playground :

<code class="go">package main

import (
    "fmt"
)

func other(done chan bool) {
    done <- true
    go func() {
        for {
            fmt.Println("Here")
        }
    }()
}

func main() {
    fmt.Println("Hello, playground")
    done := make(chan bool)
    go other(done)
    <-done
    fmt.Println("Finished.")
}</code>

Dans Go Playground, cela a entraîné une erreur : "Le processus a pris trop de temps." Cela suggère que la goroutine créée dans d'autres s'exécute indéfiniment.

Cependant, l'exécution du même code localement a produit la sortie immédiate :

<code class="go">Hello, playground.
Finished.</code>

Cela implique que la goroutine dans d'autres sorties lorsque la goroutine principale se termine.

Explication

La disparité est due à la valeur par défaut de GOMAXPROCS.

Sur le Go Playground, GOMAXPROCS est réglé sur 1. Ce signifie qu'un seul goroutine peut s'exécuter à la fois. Lorsque la goroutine créée dans un autre ne bloque pas (par exemple, en attendant sur un canal), le planificateur ne passera pas à d'autres goroutines.

Puisque la goroutine principale bloque sur le canal terminé, le planificateur passe au goroutine dans l'autre. Ensuite, la goroutine à l'intérieur d'un autre lance une autre goroutine avec une boucle sans fin. Puisque GOMAXPROCS est égal à 1, la goroutine principale ne continue pas et la boucle sans fin continue de s'exécuter, entraînant l'expiration du délai d'attente.

Sur la machine locale, GOMAXPROCS utilise généralement par défaut le nombre de cœurs de processeur. (par exemple, 4 ou 8). Cela permet à plusieurs goroutines de s'exécuter simultanément. Lorsque la goroutine principale se bloque sur le canal terminé, le planificateur passe à une autre goroutine. Cela pourrait être la goroutine dans l'autre ou la goroutine exécutant la boucle sans fin.

Puisque la goroutine principale finira par se terminer, la boucle sans fin ne fonctionnera plus. Par conséquent, le programme se terminera normalement, sans attendre la fin de la boucle sans fin.

Conclusion

Lors de l'exécution de goroutines dans Go Playground, il est important de prendre en compte la valeur par défaut de GOMAXPROCS. Pour simuler la concurrence multi-goroutines, définissez explicitement GOMAXPROCS sur une valeur plus élevée, telle que runtime.GOMAXPROCS(2). En exécution locale, le paramètre par défaut de GOMAXPROCS autorise généralement le comportement de concurrence attendu.

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:
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