1、使用 time.After()
创建超时退出&chan&select
通过 time.After()
函数创建一个超时通道,当超时发生时,通道会发送一个信号。结合 select
语句,可以在超时时退出程序。
package mainimport ("fmt""time"
)func main() {timeout := 5 * time.Seconddone := make(chan bool, 1)// 模拟长时间运行的协程go func() {// 这里可以执行一些长时间运行的任务time.Sleep(35 * time.Second)done <- true}()select {case <-done:fmt.Println("任务完成")case <-time.After(timeout):fmt.Println("超时退出")return}
}
2、使用context.WithTimeout
package mainimport ("context""fmt""time"
)func main() {timeout := 5 * time.Secondctx, cancel := context.WithTimeout(context.Background(), timeout)defer cancel()done := make(chan bool)go func() {// 模拟耗时操作time.Sleep(20 * time.Second)done <- true}()select {case <-done:fmt.Println("任务已成功完成")case <-ctx.Done():fmt.Println("任务超时")}
}