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

Linda Hamilton
Lepaskan: 2024-11-09 04:38:02
asal
551 orang telah melayarinya

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

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

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

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!

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