管理 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中文網其他相關文章!