首頁 > 後端開發 > Golang > 主體

如何優雅地停止 Go 中在 Ticker Channel 上運行的 Goroutine?

Patricia Arquette
發布: 2024-11-09 01:40:02
原創
428 人瀏覽過

How to Gracefully Stop a Goroutine Running on a Ticker Channel in Go?

管理 Go 中的 Ticker Stop 行為

處理通道時,考慮發送和接收操作的行為非常重要。對於股票通道,呼叫ticker.Stop()將停止股票產生新值,但通道本身保持開啟狀態。

挑戰:懸掛 Goroutine

提供的程式碼片段示範了一個在股票通道上運行的 goroutine。然而,當呼叫ticker.Stop()時,goroutine會無限期地保持活動狀態,因為通道沒有關閉。

解決方案:使用第二個通道

來優雅地處理這種情況,可以引入輔助通道(止損)。 Goroutine 可以監聽 select 語句中的 Ticker 通道和 Stop 通道。當停止通道上收到停止訊號時,goroutine 可以自行關閉並退出。

下面修改後的程式碼採用了此解決方案:

package main

import (
    "log"
    "time"
)

// Every runs the provided function every tick.
// Return false from the function 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 {
        log.Println("tick")
        return true
    })

    time.Sleep(3 * time.Second)
    log.Println("stopping ticker")
    stop <- true
    time.Sleep(3 * time.Second)
}
登入後複製

當ticker.Stop() 為現在調用,在停止通道上發送信號,導致goroutine 優雅退出,即使在股票代碼已停止產生值之後也是如此。

以上是如何優雅地停止 Go 中在 Ticker Channel 上運行的 Goroutine?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板