Arrêter une goroutine avec des signaux
Dans Go, les goroutines sont des threads légers qui sont utilisés pour la concurrence. Cependant, il peut y avoir des scénarios dans lesquels nous devons mettre fin prématurément à une goroutine. Cet article explore comment y parvenir en utilisant des mécanismes de signalisation.
Dans le code fourni, l'objectif est d'arrêter une goroutine lorsqu'une condition spécifique (trop tard) devient vraie. Cependant, l'utilisation d'un deuxième canal comme proposé bloquerait effectivement la goroutine à la lecture.
Utiliser un canal supplémentaire avec Select
Une meilleure approche consiste à créer un canal séparé ( TooLate) et en utilisant select dans la goroutine pour surveiller à la fois le canal de traitement (proCh) et le canal TooLate. Lorsque tropLate reçoit un signal, la goroutine peut se terminer gracieusement.
<code class="go">package main import "fmt" import "time" func main() { tooLate := make(chan struct{}) proCh := make(chan string) go func() { for { fmt.Println("working") time.Sleep(1 * time.Second) select { case <-tooLate: fmt.Println("stopped") return case proCh <- "processed": default: // Adding default makes it non-blocking } fmt.Println("done here") } }() select { case proc := <-proCh: fmt.Println(proc) case <-time.After(1 * time.Second): fmt.Println("too late") close(tooLate) } time.Sleep(4 * time.Second) fmt.Println("finish\n") }</code>
Dans ce code mis à jour, lorsque la minuterie expire (indiquant qu'il est trop tard), le canal tropLate est fermé, envoyant un signal à la goroutine. La goroutine reçoit ce signal et se termine en conséquence.
Utilisation de sync.Cond
Une autre option à considérer consiste à utiliser sync.Cond, qui fournit un contrôle plus granulaire sur la signalisation. Cependant, cela nécessite un peu plus de logique de configuration et de synchronisation.
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!