首頁  >  文章  >  後端開發  >  這對 defer cancel() 有意義嗎?

這對 defer cancel() 有意義嗎?

王林
王林轉載
2024-02-12 13:45:06862瀏覽

这对于 defer cancel() 有意义吗?

問題內容

http.HandlerFunc 中我得到了這個。但我的問題是:在應用超時上下文之後放置 defer cancel() 是否有意義?

因為底部的選擇將繼續監聽,直到上下文完成。並且延遲將在上下文完成後執行。但那已經完成了嗎? :)

//  Apply timeout context
var cancel context.CancelFunc
ctx, cancel = context.WithTimeout(ctx, time.Duration(time.Duration(match_route.timeout) * time.Second))
defer cancel() // <--- does this make sense

go func(){
    match_route.handler(w, r.WithContext(ctx))
    cancel()
}()

select {
case <-ctx.Done():
    if ctx.Err() == context.DeadlineExceeded {
        http.Error(w, "Timeout", http.StatusRequestTimeout)
    }
}

解決方法

是的,我認為這確實有道理,實際上使用defer cancel() 的目的是確保呼叫cancel 函數來釋放與上下文關聯的資源,無論函數如何退出,在您的範例中,cancel() 函數被推遲到http.HandlerFunc 完成後或上下文完成時執行,因此go func () 負責使用提供的上下文執行match_route.handler 函數,然後呼叫cancel()明確取消上下文,select語句用於等待上下文完成,如果由於超過截止日期而完成上下文,則會傳回錯誤回應!

以上是這對 defer cancel() 有意義嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除