Tuer une goroutine : maîtriser la concurrence avec les canaux
Lorsque vous travaillez avec des boucles infinies dans des goroutines, il devient essentiel de mettre en œuvre des mécanismes pour les terminer gracieusement . Dans l'extrait de code suivant, nous avons une configuration pour démarrer et arrêter une goroutine exécutant la fonction principale :
<code class="go">func startsMain() { go main() } func stopMain() { // Kill main } func main() { // Infinite loop }</code>
Solution : Utiliser des canaux pour la terminaison de boucle
Pour tuant efficacement une boucle infinie, nous pouvons utiliser des canaux et sélectionner des instructions. En créant un canal de sortie, nous pouvons signaler à la goroutine de se terminer :
<code class="go">var quit chan struct{} func startLoop() { quit = make(chan struct{}) go loop() } func stopLoop() { close(quit) }</code>
Dans notre boucle infinie, nous introduisons une instruction select pour écouter les événements sur le canal de sortie. Si un message est reçu, la boucle est rompue et la terminaison est initiée :
<code class="go">func loop() { for { select { case <-quit: return default: // Perform other tasks } } }</code>
Canaux de taille nulle et fonctions chronométrées
Utilisation d'un canal de taille nulle ( chan struct{}) assure une communication efficace et préserve la mémoire. De plus, nous pouvons implémenter l'exécution de fonctions chronométrées à l'aide de tickers :
<code class="go">func loop() { ticker := time.NewTicker(2 * time.Second) defer ticker.Stop() for { select { case <-quit: return case <-ticker.C: // Perform timed task } } }</code>
Dans ce scénario, sélectionnez des blocs jusqu'à ce qu'un message soit reçu du canal de sortie ou du canal ticker. Cela permet à la fois une terminaison gracieuse et une exécution chronométrée des tâches.
En exploitant les canaux et les instructions sélectionnées, nous obtenons un contrôle précis sur la terminaison des goroutines, facilitant ainsi le développement d'applications Go robustes et réactives qui gèrent efficacement la concurrence.
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!