[英]Cancel Http handler request
我有響應 https 請求的處理程序。 在處理程序中,我調用了一個函數 F1(),它執行一些應用程序邏輯並連接到 mysql 數據庫並執行查詢。 我想知道如果客戶端取消請求,我如何使用 golang 上下文包來取消 Db 查詢。 我需要將 ctx 傳遞給 F1() 嗎? 此外,即使 F1() 在不到 4 的時間內返回,我現在擁有的代碼也將花費 4 秒。如何在 F1() 返回后立即返回?
func handler(w http.ResponseWriter, r *http.Request) {
ctx:= r.context()
F1()
select {
case <-ctx.Done():
case <- time.After( 4*time.Second):
}
w.WriteHeader(http.statusOk)
return
}
首先,除了閱讀context
文檔本身之外,我強烈建議您查看Context 博客文章以熟悉context
。
要解決您的具體問題:
如果用戶取消了他們的查詢,你如何取消數據庫查詢?
為了使這項工作正常進行,您需要檢查以下幾點:
database/sql
)支持上下文取消。db.QueryContext
而不是db.Query
)。我需要將 ctx 傳遞給 F1() 嗎?
根據上面的#3,是的:您需要通過所有中間調用傳遞上下文,以將數據庫調用與請求上下文“連接”。
如何在 F1() 返回后立即返回?
您在問題中的代碼將F1
與您的取消/超時select
一起調用,而不是同時調用。
如果您想對數據庫調用應用特定的截止日期,請使用context.WithTimeout
來限制它需要多長時間。 否則,您不需要做任何特別的事情:只需使用您的上下文調用F1
,其余的事情都會為您完成,不需要select
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.