Maison >développement back-end >Golang >Comment arrêter gracieusement un Goroutine en cours d'exécution sur un canal téléscripteur en Go ?
Gestion du comportement d'arrêt du téléscripteur dans Go
Lorsque vous traitez avec des canaux, il est important de prendre en compte le comportement des opérations d'envoi et de réception. Dans le cas d'un canal ticker, appeler ticker.Stop() empêchera le ticker de produire de nouvelles valeurs, mais le canal lui-même reste ouvert.
Défi : Goroutine suspendue
L'extrait de code fourni montre une goroutine qui s'étend sur un canal ticker. Cependant, lorsque ticker.Stop() est appelé, la goroutine reste active indéfiniment car le canal n'est pas fermé.
Solution : utiliser un deuxième canal
Pour gérer gracieusement Dans cette situation, un canal secondaire (stop) peut être introduit. La goroutine peut écouter à la fois sur le canal ticker et sur le canal stop dans une instruction select. Lorsqu'un signal d'arrêt est reçu sur le canal d'arrêt, la goroutine peut se fermer et sortir.
Le code modifié ci-dessous intègre cette solution :
package main import ( "log" "time" ) // Every runs the provided function every tick. // Return false from the function to stop the ticker. func Every(duration time.Duration, work func(time.Time) bool) chan bool { ticker := time.NewTicker(duration) stop := make(chan bool, 1) go func() { defer log.Println("ticker stopped") for { select { case time := <-ticker.C: if !work(time) { stop <- true } case <-stop: return } } }() return stop } func main() { stop := Every(1*time.Second, func(time.Time) bool { log.Println("tick") return true }) time.Sleep(3 * time.Second) log.Println("stopping ticker") stop <- true time.Sleep(3 * time.Second) }
Lorsque ticker.Stop() est maintenant appelé, un signal est envoyé sur le canal d'arrêt, provoquant la sortie gracieuse de la goroutine, même après que le ticker a cessé de produire des valeurs.
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!