读 etcd 源码看到一种超时的设置方法,控制一个循环的总时长,每轮迭代检查一下是否超时,适用于对超时时间要求不是非常精细,并且操作不会阻塞的场景
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 6*time.Second)
defer cancel()
for i := 0; i < 10; i++ {
select {
case <-ctx.Done():
fmt.Println(ctx.Err())
return
default:
}
time.Sleep(time.Second * time.Duration(i))
fmt.Printf("in time: %d\n", i)
}
}