Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Ticker.Stop() berkelakuan di Golang, dan bagaimanakah kita boleh memastikan keluar yang anggun untuk gorouti ticker?

Bagaimanakah Ticker.Stop() berkelakuan di Golang, dan bagaimanakah kita boleh memastikan keluar yang anggun untuk gorouti ticker?

Linda Hamilton
Linda Hamiltonasal
2024-11-09 04:38:02549semak imbas

How does Ticker.Stop() behave in Golang, and how can we ensure graceful exits for ticker goroutines?

Tingkah laku Henti Ticker di Golang: Mengendalikan Jalan Keluar Anggun

Di Golang, saluran ticker biasanya digunakan untuk mencipta acara yang kerap berlaku. Walau bagaimanapun, adalah penting untuk memahami cara Stop() berkelakuan untuk memastikan pengendalian saluran yang betul.

Pertimbangkan coretan kod berikut:

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)

Apabila ticker.Stop() dipanggil, ticker adalah dijeda, tetapi saluran tidak ditutup secara automatik. Ini bermakna goroutine akan berhenti seketika tetapi tidak akan tamat. Menjalankan kod di atas menghasilkan output berikut:

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

Oleh itu, goroutine kekal disekat menunggu acara ticker selanjutnya.

Untuk menyelesaikan isu ini, seseorang boleh menggunakan saluran kedua untuk menyampaikan hentikan permintaan kepada goroutine ticker. Berikut ialah contoh:

package main

import (
    "log"
    "sync"
    "time"
)

type Ticker struct {
    sync.Mutex
    ticker *time.Ticker
    stop   chan struct{}
}

func (t *Ticker) Start(d time.Duration) {
    t.Lock()
    defer t.Unlock()

    if t.ticker != nil {
        t.ticker.Stop()
    }

    t.ticker = time.NewTicker(d)
    t.stop = make(chan struct{})

    go func() {
        for {
            select {
            case <-t.ticker.C:
                log.Println("tick")
            case <-t.stop:
                return
            }
        }
    }()
}

func (t *Ticker) Stop() {
    t.Lock()
    defer t.Unlock()

    if t.stop != nil {
        close(t.stop)
        t.ticker.Stop()
    }
}

func main() {
    t := Ticker{}
    t.Start(1 * time.Second)

    time.Sleep(3 * time.Second)
    log.Println("stopping ticker")
    t.Stop()

    time.Sleep(3 * time.Second)
}

Dengan menggunakan saluran henti yang berasingan, kami boleh memastikan penamatan goroutine ticker dengan betul apabila kaedah Ticker.Stop() dipanggil.

Atas ialah kandungan terperinci Bagaimanakah Ticker.Stop() berkelakuan di Golang, dan bagaimanakah kita boleh memastikan keluar yang anggun untuk gorouti ticker?. 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