Maison  >  Article  >  développement back-end  >  Comment mettre fin efficacement à une Goroutine en Go ?

Comment mettre fin efficacement à une Goroutine en Go ?

DDD
DDDoriginal
2024-10-30 13:15:03664parcourir

How do you effectively terminate a Goroutine in Go?

Tuer 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.

Solution : utiliser un canal et sélectionner

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.

Autres modèles de concurrence

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.

Utilisation de minuteries

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn