func TestContext(t *testing.T){ message:=make(chan int,10) //producer for i:=0;i<10;i++{ message<-i } //consumer ctx,cancel:=context.WithTimeout(context.Background(),time.Second*5) go func(ctx context.Context) { ticker := time.NewTicker(1 * time.Second) for _ = range ticker.C { select { case <-ctx.Done(): fmt.Println("child process interrupt...") return default: fmt.Printf("send message: %d\n", <-message) } } }(ctx) defer close(message) defer cancel() select{ case <-ctx.Done(): //time.Sleep(1*time.Second) fmt.Println("main process exit!") }}Q1:“延迟取消”什么时候执行?选择后?Q2:Q1中,如果在select后执行“defer cancel”,ctx.Done()会返回nil吗?选择会被阻止吗?
1 回答
呼如林
TA贡献1798条经验 获得超3个赞
所有延迟的函数调用都将在函数体运行之后,但在函数返回之前运行,所以是的,延迟取消将在之后执行select
。
Select 将阻塞直到上下文超时。当 context 超时时,<-ctx.Done()
case 将被启用,因此 select 可以在 context 超时后继续。
- 1 回答
- 0 关注
- 113 浏览
添加回答
举报
0/150
提交
取消