以下代码,逻辑上的执行结果 应该是:
1
2
3
...
exit...
但是名实际上是:
1
exit...
为什么会这样呢
14 ctx := context.Background()
15 ctx1, cannel := context.WithTimeout(ctx, times)
16
17 go func(ctx context.Context) {
18 count := 1
19 for {
20 select {
21 case <-ctx.Done():
22 fmt.Println("exit....")
23 return
24 default:
25 fmt.Println(count)
26 count++
27 time.Sleep(times * 10)
28 }
29 }
30 }(ctx1)
31
32 time.Sleep(time.Second * 3)
33 cannel()
更多评论
你代码 `times` 变量是多久?`<-ctx.Done():` 是接收超时的信号; 但是你的 `default: time.Sleep(times * 10)` 阻塞住代码了,正常只会输出 1 然后超时退出了。
#2
先不考虑你的 `times` 提前到期的情况, 正常你下面等待3s 上面的go程肯定指定到了for循环的select里面, 因为还在3s内会走一次default, default等待10s后 ctx 已经结束了, 所以下一次循环就会走入 `ctx.Done`里面, 打印 exit
#3