Golang 函数的超时和重试策略
在分布式系统中,处理因网络问题或其他因素导致的失败至关重要。Go 提供了内置功能来实现函数超时和重试策略。
超时处理
使用 context 包可以设置函数执行的超时。context 包定义了 Context 接口,它提供了请求的取消和超时功能。
立即学习“go语言免费学习笔记(深入)”;
import ( "context" "log" "time" ) // 超时函数 func timeoutFunc(ctx context.Context) { // 模拟长时间运行的任务 for { select { case <-ctx.Done(): log.Println("Function timed out") return default: // 任务逻辑 } } } // 带超时的 main 函数 func main() { // 设置 5 秒超时 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // 调用带超时的函数 timeoutFunc(ctx) }
重试策略
Go 提供了 sync/atomic 包来进行原子操作。可以使用 sync/atomic 原子地更新重试次数。还可以使用 time 包来引入重试延迟。
实战案例
以下是一个使用超时和重试策略的真实世界示例:
import ( "context" "log" "sync/atomic" "time" ) // 重试函数 func retryFunc(ctx context.Context) { retries := int64(0) for { // 模拟调用远程服务 response, err := callRemoteService() if err != nil { // 如果发生错误,则增加重试次数并重试 atomic.AddInt64(&retries, 1) // 引入重试延迟 time.Sleep(time.Duration(retries) * time.Second) // 检查重试是否超过限制 if retries >= 3 { log.Println("Exceeded retry limit") return } continue } // 成功则返回响应 return response } } // 调用远程服务的模拟函数 func callRemoteService() (int, error) { // 模拟远程服务调用失败 if rand.Intn(10) < 5 { return 0, errors.New("failed") } return rand.Int(), nil } // 带超时的 main 函数 func main() { // 设置 10 秒超时 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() // 调用带超时的重试函数 response, err := retryFunc(ctx) if err != nil { log.Println(err) } else { log.Println("Response:", response) } }
以上就是Golang 函数的超时和重试策略的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系 yyfuon@163.com