首页 >后端开发 >Golang >如何使用上下文在设定时间后优雅地停止 Goroutine?

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

Barbara Streisand
Barbara Streisand原创
2024-11-20 14:48:18833浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn