Goroutines bloquant les autres
Dans Go, une goroutine est un fil d'exécution léger. Normalement, les goroutines peuvent s'exécuter simultanément sans se bloquer. Cependant, dans certaines circonstances, une goroutine peut bloquer l'exécution des autres.
Considérez le code suivant :
func main() { timeout := make(chan int) go func() { time.Sleep(time.Second) timeout <- 1 }() res := make(chan int) go func() { for { } res <- 1 }() select { case <-timeout: fmt.Println("timeout") case <-res: fmt.Println("res") } }
Dans cet exemple, une goroutine est démarrée avec une boucle infinie. Normalement, cette goroutine ne devrait pas empêcher les autres goroutines de s'exécuter. Cependant, il semble que la première goroutine empêche la deuxième goroutine d'envoyer vers le canal de délai d'attente.
Explication
Ce comportement est dû à la façon dont les goroutines sont programmé dans Go. La planification coopérative est utilisée, ce qui signifie que les goroutines doivent volontairement céder l'exécution au planificateur pour qu'une autre goroutine puisse s'exécuter. Dans le code fourni, la goroutine avec la boucle infinie ne cède jamais, ce qui empêche l'autre goroutine de progresser.
Les goroutines cèdent généralement dans les conditions suivantes :
Dans ce cas , aucune de ces conditions n'est remplie, donc la goroutine avec la boucle infinie continue de fonctionner indéfiniment.
Solutions
Pour résoudre ce problème, il existe plusieurs solutions possibles :
La meilleure solution pour votre application spécifique dépendra de la nature des goroutines et du comportement souhaité.
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!