La routine Go bloque les autres : une explication plus approfondie
Dans Go, le code suivant présente un comportement inhabituel où une goroutine avec une boucle infinie semble empêche le message d'une autre goroutine d'atteindre le canal prévu :
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") } }
Au lieu de se terminer après un Deuxièmement, le programme entre dans une boucle infinie. Pourquoi cela se produit-il ?
Comprendre la planification coopérative dans Go
La réponse réside dans l'utilisation par Go de la planification coopérative pour les goroutines. Les Goroutines cèdent le contrôle au planificateur dans certaines conditions, notamment :
Étant donné que la boucle infinie de la première goroutine ne cède jamais, elle empêche les autres goroutines de s'exécuter et d'envoyer des messages aux canaux. Cela inclut le canal de délai d'attente, qui attend un message qui n'arrivera jamais.
Solutions potentielles
Bien que la planification coopérative puisse conduire à de telles situations, il existe des solutions potentielles :
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!