首页 > 后端开发 > Golang > 正文

如何使用上下文在设定时间后优雅地停止 Goroutine?

Barbara Streisand
发布: 2024-11-20 14:48:18
原创
771 人浏览过

How to Gracefully Stop Goroutines After a Set Time Using Context?

如何使用上下文在指定时间后停止 Goroutine

问题背景

在负载测试中,大量 HTTP 调用在 Goroutine 中编排,它变成对于控制这些例程的执行持续时间至关重要。这允许用户在预定义的时间终止负载测试。

失败的方法

实现此目的的一种常见尝试是使用 goroutine 来监视 time.Sleep() 持续时间和广播终止信号通过渠道。虽然这种方法在某些情况下可能就足够了,但当 goroutine 继续在主 goroutine 之外进行 HTTP 调用时,它会失败。

解决方案:使用上下文

Go 1.7 引入了基本的 context 包来解决这个问题。上下文提供了一种结构化的方式来取消和监视 goroutine 执行,为基于时间的终止提供了可靠的解决方案。

package main

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

func test(ctx context.Context) {
    t := time.Now()

    select {
    case <-time.After(1 * time.Second):
        fmt.Println("overslept")
    case <-ctx.Done():
    }
    fmt.Println("used:", time.Since(t))
}

func main() {
    ctx, _ := context.WithTimeout(context.Background(), 50*time.Millisecond)
    test(ctx)
}
登录后复制

说明:

  1. 在测试函数内,一个上下文创建 50 毫秒超时。
  2. select 语句检查 time.After 通道是否有事件(表示睡眠
  3. 当上下文超时时,select语句退出,表明goroutine已被取消。

这种方法确保goroutine被取消当超过指定时间时取消,无论它们在代码中的位置如何。

以上是如何使用上下文在设定时间后优雅地停止 Goroutine?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板