Rumah > pembangunan bahagian belakang > Golang > Bagaimana Cara Menamatkan Goroutine Dengan Betul Apabila Menggunakan Saluran Ticker di Golang?

Bagaimana Cara Menamatkan Goroutine Dengan Betul Apabila Menggunakan Saluran Ticker di Golang?

Patricia Arquette
Lepaskan: 2024-11-07 19:16:02
asal
484 orang telah melayarinya

How to Properly Terminate a Goroutine When Using a Ticker Channel in Golang?

Gelagat Saluran Ticker di Golang

Jika anda melelakan saluran ticker dan memanggil Stop(), saluran akan dijeda tetapi tidak ditutup. Ini boleh menyebabkan goroutine kekal aktif selama-lamanya.

Contoh Kes:

Pertimbangkan coretan kod berikut:

package main

import (
    "fmt"
    "time"
)

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

Output:

2013/07/22 14:26:53 tick
2013/07/22 14:26:54 tick
2013/07/22 14:26:55 tick
2013/07/22 14:26:55 stopping ticker
Salin selepas log masuk

Seperti yang anda lihat, walaupun menghentikan ticker, goroutine terus berulang selama-lamanya kerana saluran tidak ditutup.

Penyelesaian:

Salah satu cara untuk memastikan goroutine ditamatkan adalah dengan menggunakan saluran kedua seperti berikut:

package main

import (
    "fmt"
    "log"
    "time"
)

// Run the function every tick
// Return false from the func 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 {
        fmt.Println("tick")
        return true
    })

    time.Sleep(3 * time.Second)
    fmt.Println("stopping ticker")
    stop <- true
    time.Sleep(3 * time.Second)
}
Salin selepas log masuk

Dalam ini kod:

  • Fungsi Setiap mencipta dua saluran: saluran ticker dan saluran henti.
  • Groutine berulang pada kedua-dua saluran.
  • Jika fungsi kerja kembali false, saluran henti dimaklumkan, menyebabkan goroutine terkeluar.
  • Apabila Stop() dipanggil, ia menghantar mesej kepada saluran berhenti, yang menamatkan goroutine.

Atas ialah kandungan terperinci Bagaimana Cara Menamatkan Goroutine Dengan Betul Apabila Menggunakan Saluran Ticker di Golang?. 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