为什么超时的 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
上下文取消不是 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 可以正确清理并终止。