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
Patricia Arquetteasal
2024-11-07 19:16:02542semak imbas

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)
}

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

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)
}

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!

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