亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過上下文防止爭用條件。錯誤()

通過上下文防止爭用條件。錯誤()

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條經驗 獲得超14個贊

如果返回上下文錯誤或包裝上下文錯誤,請使用以下代碼確定是否由于截止時間或取消而返回: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 關注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號