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

這對 defer cancel() 有意義嗎?

王林
發布: 2024-02-12 13:45:06
轉載
908 人瀏覽過

这对于 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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板