Maison > Article > développement back-end > Comment mettre fin efficacement à une Goroutine en Go ?
Lorsque vous travaillez avec des routines Go, savoir comment y mettre fin efficacement devient essentiel. Considérez la configuration suivante :
<code class="go">func startsMain() { go main() } func stopMain() { // TODO: Kill main } func main() { // Infinite loop }</code>
Cette configuration crée une boucle infinie dans la goroutine nommée main. Pour terminer la boucle, nous avons besoin d'un moyen de contrôler la goroutine depuis stopMain.
Une approche efficace pour tuer une goroutine consiste à utiliser les canaux et l'instruction select.
<code class="go">var quit chan struct{} func startLoop() { quit := make(chan struct{}) go loop(quit) } func stopLoop() { close(quit) } func loop(quit chan struct{}) { for { select { case <-quit: return default: // Do stuff } } }</code>
Dans cet exemple, nous utilisons un canal de taille nulle (chan struct{}) nommé quit pour signaler à la goroutine de s'arrêter. La fonction de boucle vérifie à plusieurs reprises le canal de sortie à l'aide de l'instruction select. Lorsque quit reçoit une valeur (indiquant une demande d'arrêt), la boucle se termine.
Go propose des modèles de concurrence supplémentaires pour gérer les goroutines. Visitez le blog Go pour plus d'informations sur ces modèles.
Pour exécuter une fonction à intervalles réguliers tout en évitant l'épuisement du processeur, vous pouvez utiliser des tickers.
<code class="go">import "time" // [...] func loop() { ticker := time.NewTicker(2 * time.Second) defer ticker.Stop() for { select { case <-quit: return case <-ticker.C: // Do stuff } } }</code>
Dans ce cas, sélectionnez les blocs jusqu'à ce que quitter reçoive une valeur ou que le ticker se déclenche, permettant à la fonction de s'exécuter à des intervalles spécifiés.
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!