Tuer gracieusement une goroutine
Dans Go, les goroutines assurent la concurrence, permettant à plusieurs tâches de s'exécuter simultanément. Parfois, il devient nécessaire de mettre fin à une goroutine, par exemple lorsque nous devons arrêter correctement une application.
Considérez le code suivant :
<code class="go">func startsMain() { go main() } func stopMain() { //kill main } func main() { //infinite loop }</code>
Dans ce scénario, la goroutine principale s'exécute une boucle infinie, et nous souhaitons l'arrêter dans la fonction stopMain. Comment pouvons-nous y parvenir ?
La solution réside dans l’utilisation de canaux pour communiquer entre les goroutines. Voici un extrait de code amélioré :
<code class="go">var quit chan struct{} func startLoop() { quit = make(chan struct{}) go loop() } func stopLoop() { close(quit) } // BTW, you cannot call your function main, it is reserved func loop() { for { select { case <-quit: return // better than break default: // do stuff. I'd call a function, for clarity: do_stuff() } } }</code>
Nous introduisons un canal de sortie de type struct{}, qui peut contenir une valeur de structure vide.
Ce mécanisme nous permet de terminer gracieusement la boucle infinie en signalant la goroutine via le canal de sortie.
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!