Wie kann man eine Goroutine, die auf einem Ticker-Kanal in Go läuft, ordnungsgemäß stoppen?

Patricia Arquette
Freigeben: 2024-11-09 01:40:02
Original
409 Leute haben es durchsucht

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

Verwalten des Ticker-Stopp-Verhaltens in Go

Beim Umgang mit Kanälen ist es wichtig, das Verhalten von Sende- und Empfangsvorgängen zu berücksichtigen. Im Falle eines Tickerkanals verhindert der Aufruf von ticker.Stop(), dass der Ticker neue Werte erzeugt, aber der Kanal selbst bleibt geöffnet.

Herausforderung: Hängende Goroutine

Das bereitgestellte Code-Snippet demonstriert eine Goroutine, die sich über einen Tickerkanal erstreckt. Wenn jedoch ticker.Stop() aufgerufen wird, bleibt die Goroutine auf unbestimmte Zeit aktiv, da der Kanal nicht geschlossen ist.

Lösung: Verwendung eines zweiten Kanals

Für eine elegante Handhabung In dieser Situation kann ein sekundärer Kanal (Stopp) eingeführt werden. Die Goroutine kann in einer Select-Anweisung sowohl den Tickerkanal als auch den Stoppkanal abhören. Wenn auf dem Stoppkanal ein Signal zum Stoppen empfangen wird, kann sich die Goroutine selbst schließen und beenden.

Der geänderte Code unten enthält diese Lösung:

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)
}
Nach dem Login kopieren

Wenn ticker.Stop() ist Jetzt aufgerufen, wird ein Signal an den Stoppkanal gesendet, wodurch die Goroutine ordnungsgemäß beendet wird, selbst nachdem der Ticker keine Werte mehr produziert.

Das obige ist der detaillierte Inhalt vonWie kann man eine Goroutine, die auf einem Ticker-Kanal in Go läuft, ordnungsgemäß stoppen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!