在负载测试中,大量 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) }
说明:
这种方法确保goroutine被取消当超过指定时间时取消,无论它们在代码中的位置如何。
以上是如何使用上下文在设定时间后优雅地停止 Goroutine?的详细内容。更多信息请关注PHP中文网其他相关文章!