Go并发编程:巧用Context处理超时与取消

简介: Go并发编程:巧用Context处理超时与取消

Go并发编程:巧用Context处理超时与取消

在Go语言中,goroutine的并发模型虽然强大,但也带来了超时控制和取消操作的挑战。标准库的context包正是为此而生,它能优雅地传递取消信号、超时时间以及请求范围的值。本文将介绍如何利用context.WithTimeoutselect语句实现超时控制。

基础用法

假设我们有一个耗时的任务(如HTTP请求、数据库查询),需要设置超时限制:

func doWork(ctx context.Context) error {
   
    // 模拟耗时任务
    select {
   
    case <-time.After(3 * time.Second):
        return nil
    case <-ctx.Done():
        return ctx.Err()
    }
}

func main() {
   
    ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    defer cancel() // 确保资源释放

    err := doWork(ctx)
    if err != nil {
   
        fmt.Println("任务失败:", err) // 输出: 任务失败: context deadline exceeded
    }
}

这里doWork通过select同时监听任务完成和context取消。当超时触发,ctx.Done()返回的channel被关闭,任务立即退出并返回超时错误。

更复杂的场景:多个goroutine协作

当启动多个worker时,使用context可以一次性取消所有goroutine:

func worker(ctx context.Context, id int) {
   
    for {
   
        select {
   
        case <-ctx.Done():
            fmt.Printf("worker %d 停止\n", id)
            return
        default:
            // 模拟工作
            time.Sleep(500 * time.Millisecond)
        }
    }
}

func main() {
   
    ctx, cancel := context.WithCancel(context.Background())
    for i := 0; i < 3; i++ {
   
        go worker(ctx, i)
    }

    time.Sleep(2 * time.Second)
    cancel() // 发出取消信号,所有worker停止
    time.Sleep(1 * time.Second) // 等待输出
}

通过context.WithCancel,主函数可以在任意时刻通知所有worker停止,避免了goroutine泄漏。

总结

context包是Go并发编程的基石,它提供了:

  • WithCancel:手动取消
  • WithTimeout/WithDeadline:自动超时
  • WithValue:传递请求范围的值(谨慎使用)

合理使用context能让你的并发程序更健壮、更易于维护。掌握它,写出更优雅的Go代码吧!

目录
相关文章
|
算法 Java 大数据
深入理解Go的垃圾回收机制
深入理解Go的垃圾回收机制
404 0
|
5月前
|
安全 PHP
掌握这 4 个 PHP 技巧,代码质量瞬间提升
掌握这 4 个 PHP 技巧,代码质量瞬间提升
|
Shell Linux C语言
【Shell 命令集合 文件管理】Linux 将多个文件的内容按列合并 paste命令使用指南
【Shell 命令集合 文件管理】Linux 将多个文件的内容按列合并 paste命令使用指南
1184 0
|
XML JSON 前端开发
Day03:Gin框架快速入门01 响应| 青训营
Day03:Gin框架快速入门01 响应| 青训营
|
7月前
|
人工智能 安全 算法
从“工具过载”到“精准调用”:破解 Agent 工具管理难题
AgentScope Java × Higress:语义驱动工具精选,高效安全降成本。
808 61
|
网络协议 网络安全 网络架构
移动宽带不借助软件和公网服务器实现基于IPV6的内网穿透
本教程指导如何设置路由器以支持IPv6访问:首先确保上网方式为自动获取IP,接着在路由器设置中开启IPv6功能,并关闭可能阻碍连接的防火墙。最后,在光猫管理界面同样关闭防火墙以确保无障碍的IPv6访问路径。操作时请注意网络安全。
移动宽带不借助软件和公网服务器实现基于IPV6的内网穿透
|
JavaScript
【Layui】表单验证
【Layui】表单验证
720 0
【Layui】表单验证
|
Go
Go语言Channel进阶:巧妙运用超时机制
Go语言Channel进阶:巧妙运用超时机制
744 0
|
Go API 网络架构
Gin框架快速入门1
Gin框架快速入门1
430 0
|
1月前
|
人工智能 弹性计算 自然语言处理
零代码建站 + 全链路运营!阿里云万小智 AI 员工,10 分钟搞定品牌官网
万小智是阿里云推出的AI建站平台,基于通义大模型,集成AI建站、创意配图、智能客服、SEO内容四大能力,10分钟极速上线品牌官网;预置多行业模板,支持对话式编辑;深度整合阿里云安全与算力,备案发布一站式完成,小微企业建站更省时、省力、更安心。
294 0

热门文章

最新文章