据我所知,在 Go 中使用上下文时,检查上下文是否被取消或达到最后期限的正确方法是调用上下文。Err() 在有问题的代码之后。所以像这样:
func myFunc(ctx context.Context) {
// call some context-aware functionality
result, err := SomeContextAwareFunc(ctx)
// check if we hit a deadline or cancellation
if ctxErr := ctx.Err(); ctxErr != nil {
// handle an expired and/or cancelled context here
}
// process the result
_ = result
}
但是,如果我没有记错的话,这代表了一个竞争条件。上下文可能在 SomeContextAwareFunc 之后但在调用 Err 函数之前过期。在这种情况下,我们会认为上下文过期会缩短SomeContextAwareFunc,但它实际上并没有(例如,我们可以使用结果)。
我在 Playground 中测试了这一点,在函数返回和调用 Err 之间人为延迟,它确实错误地指示了过期的上下文。https://play.golang.org/p/Rd-fhWOW-AB
防止这种情况的正确方法是什么?上下文感知函数是否必须始终返回错误,以便调用方仅在返回错误时才检查上下文?
翻翻过去那场雪
相关分类