为什么超时的 GoLang 上下文无法正常工作?

问题描述 投票:0回答:1

为什么超时的 GoLang 上下文无法正常工作?

package main

import (
    "context"
    "fmt"
    "time"
)

func test1(ctx context.Context) {
    fmt.Println("Print2")
}

func test(ctx context.Context) {
    t1 := time.Now()

    time.Sleep(10 * time.Second)
    fmt.Println("Print1")
    fmt.Println(time.Since(t1))
    test1(ctx)
    fmt.Println(time.Since(t1))
}

func main() {
    fmt.Println("Print0")
    ctx, cancel := context.WithTimeout(context.Background(), 9*time.Second)
    test(ctx)
    cancel()
    fmt.Println("Print3")
}

由于官方文档称超时上下文会自动取消,因此所有 Print 语句都不应该起作用。但是,得到的最终答复是:

Print0
Print1
10s
Print2
10s
Print3

go timeout
1个回答
0
投票

上下文取消不是 Goroutine 取消。你必须检查 goroutine 中的上下文是否被取消,并采取相应的行动。

func test1(ctx context.Context) {
    // Check if context canceled
    if ctx.Err()!=nil {
       fmt.Println("Canceled")
       return
    }
    fmt.Println("Print2")
}

此机制允许 goroutine 通过

Context.Done()
通道或通过
Context.Err()
方法接收上下文取消。收到此通知后,goroutine 可以正确清理并终止。

© www.soinside.com 2019 - 2024. All rights reserved.