请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

time.Sleep()和time.After这一块是不是讲的有问题?

在文档中 有这样一句话 而通道接收<-time.After(d)操作将使当前协程进入阻塞状态

如果协程阻塞在了case <-time.After(time.Second * 10) 这一行,那么for循环是不是应该停止了?等解除阻塞 for再进行下一轮循环? 但实际是:一旦ctx.Done这个channel中有数据,这个 case <-ctx.Done() 立马就执行了。
for {
select {
case <-ctx.Done():
fmt.Println(“Cancelled”, time.Now())
return
case <-time.After(time.Second * 10):
fmt.Println(“time.After done”, time.Now())
return
}
}
但是相反,time.Sleep 确实是将当前的协程阻塞了,time.Sleep执行不完,后面的都别想执行

正在回答 回答被采纳积分+3

1回答

少林码僧 2024-02-14 20:16:49

通道接收<-time.After(d)操作确实会阻塞当前协程。

假设通道接收<-time.After(d)操作不会阻塞当前协程,那么for循环会一直执行,我们在for后面加一行日志,可以判断for循环执行的次数

for {

fmt.Println("for执行了")

select {
case <-ctx.Done():

......


上面的for执行了这个日志只会打印一次。

说明在执行cancel()之前for循环确实被阻塞了。

这里核心需要理解的点是<-time.After(d)这种通道操作的阻塞是可以随时被中断的,而time.Sleep的阻塞是无法被中断的。


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信