go如何封装一个通用协程带超时机制

在Go语言中,封装一个带有超时机制的通用协程通常涉及使用`context`包,它允许你为操作设置一个超时时间。下面是一个使用`context.WithTimeout`函数封装超时协程的示例:

```go
package main

import (
    "context"
    "fmt"
    "time"
)

// 模拟一个可能需要超时控制的协程函数
func work(ctx context.Context, job string) {
    // 模拟工作,使用一个无限循环来代表长时间运行的任务
    // 这里使用select来监听两个channel:ctx.Done()和另一个模拟工作的channel
    // ctx.Done()会在超时或取消时关闭
    for {
        select {
        case <-ctx.Done():
            // 超时或取消,退出协程
            fmt.Printf("job %s is cancelled/timeout\n", job)
            return
        default:
            // 模拟工作负载
            time.Sleep(100 * time.Millisecond)
            fmt.Printf("working on %s\n", job)
        }
    }
}

func main() {
    // 创建一个超时为2秒的context
    ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    defer cancel()

    // 启动协程
    go work(ctx, "job1")

    // 主协程等待超时或协程完成
    <-ctx.Done()

    fmt.Println("main goroutine continues...")
}
```

在这个例子中,`work`函数接受一个`context.Context`作为参数,这个`context`可以被用来传递取消信号或超时信号到协程。`context.WithTimeout`函数创建了一个新的`context`,它在指定的时间后自动取消。

在`main`函数中,我们创建了一个2秒超时的`context`,并将其传递给`work`协程。`work`协程在一个`select`语句中监听`ctx.Done()`,这个channel会在超时或取消时关闭。如果`ctx.Done()`被触发,协程会打印一条消息并退出。

最后,`main`协程通过监听`ctx.Done()`来等待超时或协程完成。一旦`ctx.Done()`返回,主协程会继续执行。

这种方法的好处是它提供了一种灵活且标准的方式来处理超时,并且可以在多个不同的协程和函数之间重用。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值