```go
func main() {
select{
case<-time.After(1*time.Second):
fmt.Println("timeout")
default:
//fmt.Println("doWork")
time.Sleep(2*time.Second)
fmt.Println("done")
}
fmt.Println("end")
}
```
运行结果:
doWork
done
end
计划当工作时间过长时,实现超时退出。测试发现,这段逻辑中定时并不能触发提前退出。如何才能实现阻塞调用中的超时退出?谢谢
更多评论
使用 context ,https://studygolang.com/articles/13676
话说作为一个程序员,Markdown 都还不会用吗?
#1
```go
package main
import (
"sync"
"time"
"fmt"
"context"
)
func main() {
var wg sync.WaitGroup
start:=time.Now()
ctx,cancel:=context.WithTimeout(context.Background(),2*time.Second)
defer cancel()
wg.Add(1)
go func(){
defer wg.Done()
for{
select {
case <-time.After(1 * time.Second):
fmt.Println("overslept")
return
case <-ctx.Done():
fmt.Println(ctx.Err()) // prints "context deadline exceeded"
return
default:
fmt.Println("dowork")
time.Sleep(3*time.Second)
fmt.Println("workdone")
return
}
}
}()
time.Sleep(1*time.Second)
cancel()
wg.Wait()
fmt.Println(time.Since(start))
fmt.Println("end")
}
运行...
dowork
workdone
3.0001716s
end
成功: 进程退出代码 0.
```
谢谢@polaris回复,我找了个context代码。测试结果还是没有符合预期。感觉根本原因是select是同步循环。对于阻塞没有办法控制。
#2