在使用 select{} 进行超时控制的方案中,如果做任务的协程迟迟不能返回(接近阻塞),怎么处理?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main

import (
"context"
"fmt"
"time"
)

func main() {

ctx, _ := context.WithTimeout(context.TODO(), time.Second*3)
go CallWithTimeOut(ctx)
time.Sleep(time.Second * 2)
}

func CallWithTimeOut(ctx context.Context) {

c := make(chan bool)

go func() {
// 真正的业务流程,比如进行http请求, syscall 等
//模拟延迟2s。
// 问题: 如果这个协程一直阻塞怎么办?
time.Sleep(time.Second * 2)
c <- true
}()
select {
case <- ctx.Done():
fmt.Println("timeout")
case <- c:
fmt.Println("job finished")
}
}