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

Bagaimana untuk Menamatkan Golang Ticker Goroutine dengan Anggun?

Mary-Kate Olsen
Lepaskan: 2024-11-08 16:42:02
asal
770 orang telah melayarinya

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)
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan