阻塞的协程如何超时退出?

Electricightlord · · 2806 次点击
有人用过context包吗?
#1
更多评论
你的task协程里面不是耗时才2s吗,哪里超时了
#2
task没有超时。把task sleep 时间改成大于4s,就可以看到超时了。 ```golang package main import ( "context" "fmt" "time" ) func main() { ctx, cancel := context.WithTimeout(context.TODO(), time.Second*3) defer cancel() // 防止任务比超时时间短导致资源未释放 // 启动协程 go task(ctx) // 主协程需要等待,否则直接退出 time.Sleep(time.Second * 4) } func task(ctx context.Context) { ch := make(chan struct{}, 0) // 真正的任务协程 go func() { // 模拟10秒耗时任务 这里修改成大于4秒 time.Sleep(time.Second * 10) ch <- struct{}{} }() select { case <-ch: fmt.Println("done") case <-ctx.Done(): fmt.Println("timeout") } } ```
#3