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

Comment mettre fin efficacement à une Goroutine en Go ?

DDD
Libérer: 2024-10-30 13:15:03
original
859 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal