Golang 中的 Ticker Stop 行为
使用 Golang 的 Ticker 包时,必须了解 Stop() 的行为及其影响在相关频道上。虽然调用 Stop() 有效地停止了股票发射,但它不会关闭通道。
考虑示例:
package main import ( "time" "log" ) func main() { 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) }
此代码演示了意外行为。使用ticker.Stop() 停止股票通道,但相应的goroutine 保持活动状态。这引起了人们的担忧:goroutine 的继续存在是否是不可取的,以及处理这种情况的最佳方法。
使用第二个通道来停止
一个有效的解决方案是引入第二个通道,专门用于指示股票行情停止。
package main import ( "log" "time" ) // Every runs the provided function periodically, allowing the function to control when to stop. func Every(duration time.Duration, work func(time.Time) bool) chan bool { ticker := time.NewTicker(duration) stop := make(chan bool, 1) // Channel for signaling stop go func() { defer log.Println("ticker stopped") for { select { case time := <-ticker.C: if !work(time) { // Function decides to stop stop <- true } case <-stop: // Signal to stop has been received 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 // Send the stop signal on the stop channel time.Sleep(3 * time.Second) }
在此修改后的代码中,Every() 函数同时接受持续时间和返回指示是否继续的布尔值的函数。停止通道用于向ticker goroutine传达停止信号,确保其优雅终止。
以上是如何优雅地终止 Golang Ticker Goroutine?的详细内容。更多信息请关注PHP中文网其他相关文章!