簡體   English   中英

取消 Http 處理程序請求

[英]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

要解決您的具體問題:

如果用戶取消了他們的查詢,你如何取消數據庫查詢?

為了使這項工作正常進行,您需要檢查以下幾點:

  1. 確保您的數據庫驅動程序(如果您使用database/sql )支持上下文取消。
  2. 確保您正在使用所有可用方法的 Context 變體(例如db.QueryContext而不是db.Query )。
  3. 確保您將上下文(或上下文的衍生物)通過堆棧從 HTTP 請求傳遞到數據庫調用。

我需要將 ctx 傳遞給 F1() 嗎?

根據上面的#3,是的:您需要通過所有中間調用傳遞上下文,以將數據庫調用與請求上下文“連接”。

如何在 F1() 返回后立即返回?

您在問題中的代碼將F1與您的取消/超時select一起調用,而不是同時調用。

如果您想對數據庫調用應用特定的截止日期,請使用context.WithTimeout來限制它需要多長時間。 否則,您不需要做任何特別的事情:只需使用您的上下文調用F1 ,其余的事情都會為您完成,不需要select

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM