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
Libérer: 2024-10-23 17:42:24
original
558 Les gens l'ont consulté

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

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

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!

source:php
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal