为了账号安全,请及时绑定邮箱和手机立即绑定

通过上下文防止争用条件。错误()

通过上下文防止争用条件。错误()

Go
Helenr 2022-08-24 11:38:08
据我所知,在 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防止这种情况的正确方法是什么?上下文感知函数是否必须始终返回错误,以便调用方仅在返回错误时才检查上下文?
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

如果返回上下文错误或包装上下文错误,请使用以下代码确定是否由于截止时间或取消而返回:SomeContextFunctionSomeContextFunction


result, err := SomeContextAwareFunc(ctx)

if errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled) {

     // deadline exceeded or canceled

} else if err != nil {

     // some other eror

}

由于在 SomeContextAwareFunc 返回后,截止时间可能会过期或上下文可以取消,因此测试 SomeContextAwareFunc 的错误返回是确定函数失败原因的唯一方法。


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 64 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信