我希望以下功能的行为方式相同func fillChanTimeoutUsingTicker(maxDuration time.Duration, chanSize int) chan string { c := make(chan string, chanSize) ticker := time.NewTicker(maxDuration) for { select { case <-ticker.C: ticker.Stop() fmt.Println("Ticker:operation timedout") return c case c <- "Random message": default: fmt.Println("Ticker:chan is full") return c } }}func fillChanTimeoutUsingTimeAfter(maxDuration time.Duration, chanSize int) chan string { c := make(chan string, chanSize) for { select { case <-time.After(maxDuration): fmt.Println("time.After:operation timedout") return c case c <- "Random message": default: fmt.Println("time.After:chan is full") return c } }}称他们为: resWithTicker := fillChanTimeoutUsingTicker(time.Duration(1*time.Microsecond), 10000000) fmt.Println(len(resWithTicker)) resWithTimeAfter := fillChanTimeoutUsingTimeAfter(time.Duration(1*time.Microsecond), 10000000) fmt.Println(len(resWithTimeAfter))印刷:Ticker:operation timedout43979time.After:chan is full10000000我认为他们会以完全相同的方式行事,我真的没有得到巨大的差异,对此有什么想法吗?请注意,还可以像在股票代码功能中一样使用计时器按预期工作。
1 回答
回首忆惘然
TA贡献1847条经验 获得超11个赞
问题出在您的代码中。
在您的第一个示例中,您正在创建一个股票代码并将其用于超时。
在您的第二个示例中,您每次循环时都会创建一个计时器:
case <-time.After(maxDuration):
从库源中可以看出,这相当于
case <- time.NewTimer(maxDuration).C:
如果每次循环时都创建一个新的 Ticker/Timer(并丢弃旧的),它可能永远不会触发。
因此,为了让您的第二个示例正确运行,请这样做(未经测试):
func fillChanTimeoutUsingTimeAfter(maxDuration time.Duration, chanSize int) chan string {
c := make(chan string, chanSize)
t := time.After(maxDuration)
for {
select {
case <-t:
fmt.Println("time.After:operation timedout")
return c
case c <- "Random message":
default:
fmt.Println("time.After:chan is full")
return c
}
}
}
- 1 回答
- 0 关注
- 196 浏览
添加回答
举报
0/150
提交
取消