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