如何在 Go 中让 Goroutines 超时来控制执行时间
Goroutines 是 Go 并发的一个组成部分,允许异步执行任务。但是,有时,有必要控制这些例程的持续时间并防止它们无限期地执行。
背景和问题
在负载测试工具中,您想要在指定时间后终止 goroutine 以限制 HTTP 调用过程的持续时间。当前在 goroutine 中使用 time.Sleep() 的方法创建了一个通信通道,但会导致 goroutine 过早终止。
使用 Context 的解决方案
更多推荐的方法涉及利用 golang.org/x/net/context 包(Go 1.7 的标准库中提供),特别是 context.Context 接口。 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) }
在此代码中:
以上是如何在 Go 中优雅地超时 Goroutine?的详细内容。更多信息请关注PHP中文网其他相关文章!