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