Maison > développement back-end > Golang > Comment arrêter gracieusement un Goroutine en cours d'exécution sur un canal téléscripteur en Go ?

Comment arrêter gracieusement un Goroutine en cours d'exécution sur un canal téléscripteur en Go ?

Patricia Arquette
Libérer: 2024-11-09 01:40:02
original
481 Les gens l'ont consulté

How to Gracefully Stop a Goroutine Running on a Ticker Channel in Go?

Gestion du comportement d'arrêt du téléscripteur dans Go

Lorsque vous traitez avec des canaux, il est important de prendre en compte le comportement des opérations d'envoi et de réception. Dans le cas d'un canal ticker, appeler ticker.Stop() empêchera le ticker de produire de nouvelles valeurs, mais le canal lui-même reste ouvert.

Défi : Goroutine suspendue

L'extrait de code fourni montre une goroutine qui s'étend sur un canal ticker. Cependant, lorsque ticker.Stop() est appelé, la goroutine reste active indéfiniment car le canal n'est pas fermé.

Solution : utiliser un deuxième canal

Pour gérer gracieusement Dans cette situation, un canal secondaire (stop) peut être introduit. La goroutine peut écouter à la fois sur le canal ticker et sur le canal stop dans une instruction select. Lorsqu'un signal d'arrêt est reçu sur le canal d'arrêt, la goroutine peut se fermer et sortir.

Le code modifié ci-dessous intègre cette solution :

package main

import (
    "log"
    "time"
)

// Every runs the provided function every tick.
// Return false from the function to stop the ticker.
func Every(duration time.Duration, work func(time.Time) bool) chan bool {
    ticker := time.NewTicker(duration)
    stop := make(chan bool, 1)

    go func() {
        defer log.Println("ticker stopped")
        for {
            select {
            case time := <-ticker.C:
                if !work(time) {
                    stop <- true
                }
            case <-stop:
                return
            }
        }
    }()

    return stop
}

func main() {
    stop := Every(1*time.Second, func(time.Time) bool {
        log.Println("tick")
        return true
    })

    time.Sleep(3 * time.Second)
    log.Println("stopping ticker")
    stop <- true
    time.Sleep(3 * time.Second)
}
Copier après la connexion

Lorsque ticker.Stop() est maintenant appelé, un signal est envoyé sur le canal d'arrêt, provoquant la sortie gracieuse de la goroutine, même après que le ticker a cessé de produire des valeurs.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal