1、使用 time.After()
创建超时退出&chan&select
通过 time.After()
函数创建一个超时通道,当超时发生时,通道会发送一个信号。结合 select
语句,可以在超时时退出程序。
package main
import (
"fmt"
"time"
)
func main() {
timeout := 5 * time.Second
done := 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 main
import (
"context"
"fmt"
"time"
)
func main() {
timeout := 5 * time.Second
ctx, 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("任务超时")
}
}