Que se passera-t-il en premier : le traitement du signal d'annulation ou la fin de l'enregistrement, s'ils se produisent simultanément dans le canal?
sobes.tech IA
Réponse de l'IA
En Go, lors d'une tentative simultanée d'envoyer un signal d'annulation (par exemple, en fermant un canal ou en envoyant une valeur) et de terminer l'écriture dans un canal, l'ordre de traitement n'est pas garanti et dépend du planificateur de goroutines et de l'état des canaux. Les canaux en Go synchronisent les opérations, mais si deux opérations se produisent simultanément, l'une d'elles sera exécutée en premier, mais cela n'est pas défini par la spécification.
Autrement dit, si une goroutine tente d'écrire dans un canal, et qu'une autre goroutine ferme ce canal ou envoie un signal d'annulation en même temps, il est indéterminé quelle opération sera traitée en premier. Il est important de concevoir la logique de manière à ne pas dépendre de l'ordre de tels événements simultanés.
Exemple :
cancel := make(chan struct{})
donnees := make(chan int)
// Goroutine qui écoute cancel
go func() {
select {
case <-cancel:
fmt.Println("Annulation reçue")
case v := <-donnees:
fmt.Println("Valeur reçue", v)
}
}()
// Envoi simultané
close(cancel) // signal d'annulation
// ou
// donnees <- 42 // écriture dans le canal
Dans cet exemple, la branche qui s'exécute en premier dépend du planificateur.