gpt4 book ai didi

go - 一个 ticker 是否通过它的 ticker.C 告诉一个 goroutine 它被停止了?

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:46 25 4
gpt4 key购买 nike

package main
import "fmt"
import "time"

func main() {
ticker := time.NewTicker(time.Millisecond * 500)
go func() {
for t := range ticker.C {
fmt.Println("Tick at", t)
}
fmt.Println("ticker stopped")
}()
time.Sleep(time.Second * 5)
ticker.Stop()
time.Sleep(time.Second * 5)
}

我想当我调用 ticker.Stop() 时,ticker.C 应该告诉 goroutine 它结束了,所以 for 循环应该结束,但它看起来不是那样,字符串“ticker stopped”永远不会打印出来。

最佳答案

正如 JimB 指出的那样,time.Ticker 的文档指定 Stop() 不会关闭 channel ,以防止错误地从 channel 读取。你最好的选择可能是退出 channel 。

package main

import "fmt"
import "time"

func main() {
ticker := time.NewTicker(time.Millisecond * 500)
quit := make(chan struct{})
go func() {
for {
select {
case t := <-ticker.C:
fmt.Println("Tick at", t)
case <-quit:
fmt.Println("ticker stopped")
return
}
}
}()
time.Sleep(time.Second * 5)
ticker.Stop()
close(quit)
time.Sleep(time.Second * 5)
}

https://play.golang.org/p/xTKNkMtdIf

关于go - 一个 ticker 是否通过它的 ticker.C 告诉一个 goroutine 它被停止了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46774410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com