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

如何在 Go 中优雅地超时 Goroutine?

Patricia Arquette
发布: 2024-11-19 11:56:02
原创
964 人浏览过

How to Gracefully Timeout Goroutines in Go?

如何在 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)
}
登录后复制

在此代码中:

  • 上下文。使用 context.WithTimeout() 创建超时为 50 毫秒的上下文。
  • test() goroutine 在此上下文中运行,并通过 select 等待指令。
  • 超时后,select 接收ctx.Done() 信号并优雅地退出 goroutine,防止睡过头。

以上是如何在 Go 中优雅地超时 Goroutine?的详细内容。更多信息请关注PHP中文网其他相关文章!

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