Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menamatkan Golang Ticker Goroutine dengan Anggun?

Bagaimana untuk Menamatkan Golang Ticker Goroutine dengan Anggun?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-08 16:42:02716semak imbas

How to Gracefully Terminate a Golang Ticker Goroutine?

Gelagat Berhenti Ticker di Golang

Apabila menggunakan pakej ticker Golang, adalah penting untuk memahami kelakuan Stop() dan kesannya pada saluran yang berkaitan. Semasa memanggil Stop() secara berkesan menghentikan pelepasan ticker, ia tidak menutup saluran.

Pertimbangkan contoh:

package main

import (
    "time"
    "log"
)

func main() {
    ticker := time.NewTicker(1 * time.Second)
    go func(){
        for _ = range ticker.C {
            log.Println("tick")
        }
        log.Println("stopped")
    }()
    time.Sleep(3 * time.Second)
    log.Println("stopping ticker")
    ticker.Stop()
    time.Sleep(3 * time.Second)
}

Kod ini menunjukkan gelagat yang tidak dijangka. Saluran ticker dihentikan menggunakan ticker.Stop(), tetapi goroutine yang sepadan kekal aktif. Ini menimbulkan kebimbangan sama ada kewujudan berterusan goroutine adalah tidak diingini dan pendekatan terbaik untuk menangani situasi sedemikian.

Menggunakan Saluran Kedua untuk Berhenti

Satu penyelesaian yang berkesan ialah memperkenalkan saluran kedua, khusus untuk memberi isyarat kepada penanda untuk berhenti.

package main

import (
    "log"
    "time"
)

// Every runs the provided function periodically, allowing the function to control when to stop.
func Every(duration time.Duration, work func(time.Time) bool) chan bool {
    ticker := time.NewTicker(duration)
    stop := make(chan bool, 1) // Channel for signaling stop

    go func() {
        defer log.Println("ticker stopped")
        for {
            select {
            case time := <-ticker.C:
                if !work(time) { // Function decides to stop
                    stop <- true
                }
            case <-stop: // Signal to stop has been received
                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 // Send the stop signal on the stop channel
    time.Sleep(3 * time.Second)
}

Dalam kod yang diubah suai ini, fungsi Every() mengambil kedua-dua tempoh dan fungsi yang mengembalikan boolean yang menunjukkan sama ada untuk meneruskan. Saluran henti digunakan untuk menyampaikan isyarat berhenti kepada goroutine ticker, memastikan penamatan yang anggun.

Atas ialah kandungan terperinci Bagaimana untuk Menamatkan Golang Ticker Goroutine dengan Anggun?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn