首页 >后端开发 >Golang >Go 的 context 包如何用于超时 Goroutine?

Go 的 context 包如何用于超时 Goroutine?

Susan Sarandon
Susan Sarandon原创
2024-11-20 04:36:02825浏览

How Can Go's `context` Package Be Used to Timeout Goroutines?

Go 如何处理超时 Goroutines?

问题:

您正在构建一个处理多个 HTTP 调用的工具在并发 goroutine 中。为了防止无限期执行的情况,您寻求一种在特定时间间隔后取消 goroutine 的方法。

解决方案:

同时创建 goroutine 休眠的方法在指定的时间内发送广播消息来取消其他 goroutine 似乎是合乎逻辑的,在这种情况下 goroutine 的执行似乎存在问题。

要解决此挑战,请考虑利用 Go 中的 context 包。它提供了一种有效的方法来处理 Goroutine 的超时和上下文取消。

代码片段:

下面是一个使用 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("cancelled")
    }
    fmt.Println("used:", time.Since(t))
}

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)

    go test(ctx)

    // cancel context after 30 milliseconds
    time.Sleep(30 * time.Millisecond)
    cancel()
}

此代码创建一个超时时间为 50 毫秒的上下文。然后启动一个 goroutine 来执行测试函数,并传递上下文。在测试函数中,选择语句等待超时发生或上下文被取消。 30 毫秒后,上下文被取消,导致 goroutine 完成并打印“cancelled”。

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

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