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代码吧!

目录
相关文章
|
1月前
|
SQL JSON 安全
Java开发必备的5个小技巧,让代码更优雅高效
Java开发必备的5个小技巧,让代码更优雅高效
330 142
|
1月前
|
存储 C语言 内存技术
C语言深度解析:大小端字节序——多字节数据的底层存储规则
大小端指CPU对多字节数据在内存中的存放顺序:大端高字节存低地址,小端反之。x86/ARM默认小端,网络字节序统一为大端。跨平台、网络通信、二进制协议开发中必须显式处理字节序转换,否则数据解析必错。
669 138
|
22天前
|
Python
3个让你爱不释手的Python冷门技巧
3个让你爱不释手的Python冷门技巧
300 146
|
1月前
|
安全 Java 数据库连接
Java开发实用技巧:提升代码效率与可读性
Java开发实用技巧:提升代码效率与可读性
336 136
|
14天前
|
安全 数据库连接 索引
5个让你代码更优雅的Python技巧
5个让你代码更优雅的Python技巧
215 141
|
14天前
|
大数据 PHP
5个提升开发效率的PHP技巧
5个提升开发效率的PHP技巧
253 143
|
25天前
|
安全 PHP
5个让PHP代码更优雅的实用技巧
5个让PHP代码更优雅的实用技巧
312 136
|
22天前
|
安全 PHP 索引
PHP 技巧:5个让你代码更优雅的实用函数
PHP 技巧:5个让你代码更优雅的实用函数
219 139
|
1月前
|
安全 Go
Go并发三板斧:掌握这些技巧,你的代码更高效
Go并发三板斧:掌握这些技巧,你的代码更高效
317 136
|
1月前
|
PHP
PHP技巧:让你的代码更优雅
PHP技巧:让你的代码更优雅