Go技巧:用Context包优雅管理goroutine生命周期

简介: Go技巧:用Context包优雅管理goroutine生命周期

Go技巧:用Context包优雅管理goroutine生命周期

在Go并发编程中,goroutine的启动很简单,但如何优雅地停止它们却常被忽视。今天分享一个使用context.Context管理goroutine生命周期的实用技巧。

问题场景

假设我们有一个执行任务的goroutine,需要在主程序退出前或用户取消操作时立即停止:

func worker() {
   
    for {
   
        // 模拟耗时操作
        time.Sleep(time.Second)
        fmt.Println("working...")
    }
}

这种写法无法从外部控制goroutine的退出,会造成goroutine泄漏。

解决方案:Context + select

利用context.Contextselect语句,可以优雅地实现超时控制和主动取消:

func worker(ctx context.Context) {
   
    for {
   
        select {
   
        case <-ctx.Done():
            fmt.Println("worker stopped:", ctx.Err())
            return
        default:
            // 执行实际工作
            time.Sleep(time.Second)
            fmt.Println("working...")
        }
    }
}

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

    go worker(ctx)

    // 模拟用户按任意键退出
    fmt.Scanln()
    cancel() // 手动取消
}

关键点解析

  1. ctx.Done():返回一个只读channel,当context被取消或超时时会关闭
  2. select语句:同时监听工作逻辑和取消信号,谁先到达就执行谁
  3. defer cancel():即使函数正常返回,也要确保调用cancel释放资源

进阶用法:传递元数据

Context还可以传递请求相关的元数据:

ctx := context.WithValue(context.Background(), "requestID", "req-123")

但在生产代码中,建议将必要参数显式传递,而非依赖context.Value。

总结

使用context管理goroutine生命周期是Go的最佳实践之一。它让你的并发代码更加健壮、可控,避免了资源泄漏和难以调试的并发问题。

记住:创建goroutine时,就要想清楚如何停止它

目录
相关文章
|
算法 API UED
基于Gin框架的HTTP接口限速实践
基于Gin框架的HTTP接口限速实践
483 0
|
存储 JSON Go
Go语言之空接口与类型断言
本文介绍了 Go 语言中空接口(`interface{}`)和类型断言的核心概念及其应用。空接口可存储任意类型数据,适用于通用函数、动态数据结构与 JSON 解析等场景;类型断言用于将接口变量还原为具体类型,推荐使用带 `ok` 的写法以避免程序崩溃。此外,文章通过示例讲解了 `type switch` 类型判断与 JSON 处理技巧,并总结了空接口的注意事项,强调滥用可能导致类型安全性降低。内容深入浅出,帮助开发者灵活运用这些特性。
362 15
|
监控 供应链 数据挖掘
淘宝商品详情API接口解析与 Python 实战指南
淘宝商品详情API接口是淘宝开放平台提供的编程工具,支持开发者获取商品详细信息,包括基础属性、价格、库存、销售策略及卖家信息等。适用于电商数据分析、竞品分析与价格策略优化等场景。接口功能涵盖商品基础信息、详情描述、图片视频资源、SKU属性及评价统计的查询。通过构造请求URL和签名,可便捷调用数据。典型应用场景包括电商比价工具、商品数据分析平台、供应链管理及营销活动监控等,助力高效运营与决策。
513 26
|
XML Java 数据格式
深入探索Spring的Bean注入:四种方式解析与循环依赖探讨
深入探索Spring的Bean注入:四种方式解析与循环依赖探讨
483 0
|
监控 机器人 Unix
GoLand——windows下如何编译Linux二进制文件
GoLand——windows下如何编译Linux二进制文件
305 1
GoLand——windows下如何编译Linux二进制文件
|
前端开发 Java 数据库
玩转springboot之springboot注册servlet
在Spring Boot中注册Servlet非常灵活,可以通过 `@WebServlet`注解快速注册,也可以通过 `ServletRegistrationBean`进行细粒度控制。通过这两种方式,可以满足各种场景下的需求,确保应用能够高效处理HTTP请求。
1390 14
|
SQL 关系型数据库 数据管理
在 Postgres 中使用 Delete Join
【8月更文挑战第11天】
900 0
在 Postgres 中使用 Delete Join
|
XML 前端开发 数据格式
超级详细的python中bs4模块详解
Beautiful Soup 是一个用于从网页中抓取数据的 Python 库,提供了简单易用的函数来处理导航、搜索和修改分析树。支持多种解析器,如 Python 标准库中的 HTML 解析器和更强大的 lxml 解析器。通过简单的代码即可实现复杂的数据抓取任务。本文介绍了 Beautiful Soup 的安装、基本使用、对象类型、文档树遍历和搜索方法,以及 CSS 选择器的使用。
980 1

热门文章

最新文章