Maison  >  Article  >  développement back-end  >  Comment arrêter gracieusement une Goroutine en Go à l’aide de signaux ?

Comment arrêter gracieusement une Goroutine en Go à l’aide de signaux ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-28 13:23:02435parcourir

How to Gracefully Stop a Goroutine in Go Using Signals?

Arrêter une goroutine avec des signaux

Dans Go, les goroutines sont des threads légers qui sont utilisés pour la concurrence. Cependant, il peut y avoir des scénarios dans lesquels nous devons mettre fin prématurément à une goroutine. Cet article explore comment y parvenir en utilisant des mécanismes de signalisation.

Dans le code fourni, l'objectif est d'arrêter une goroutine lorsqu'une condition spécifique (trop tard) devient vraie. Cependant, l'utilisation d'un deuxième canal comme proposé bloquerait effectivement la goroutine à la lecture.

Utiliser un canal supplémentaire avec Select

Une meilleure approche consiste à créer un canal séparé ( TooLate) et en utilisant select dans la goroutine pour surveiller à la fois le canal de traitement (proCh) et le canal TooLate. Lorsque tropLate reçoit un signal, la goroutine peut se terminer gracieusement.

<code class="go">package main

import "fmt"
import "time"

func main() {
    tooLate := make(chan struct{})
    proCh := make(chan string)

    go func() {
        for {
            fmt.Println("working")
            time.Sleep(1 * time.Second)
            select {
            case <-tooLate:
                fmt.Println("stopped")
                return
            case proCh <- "processed":
            default: // Adding default makes it non-blocking
            }
            fmt.Println("done here")
        }
    }()

    select {
    case proc := <-proCh:
        fmt.Println(proc)
    case <-time.After(1 * time.Second):
        fmt.Println("too late")
        close(tooLate)
    }

    time.Sleep(4 * time.Second)
    fmt.Println("finish\n")
}</code>

Dans ce code mis à jour, lorsque la minuterie expire (indiquant qu'il est trop tard), le canal tropLate est fermé, envoyant un signal à la goroutine. La goroutine reçoit ce signal et se termine en conséquence.

Utilisation de sync.Cond

Une autre option à considérer consiste à utiliser sync.Cond, qui fournit un contrôle plus granulaire sur la signalisation. Cependant, cela nécessite un peu plus de logique de configuration et de synchronisation.

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