取消Http处理程序请求

时间:2019-08-26 00:24:22

标签: http go

我有响应https请求的处理程序。在处理程序中,我调用函数F1(),该函数执行一些应用程序逻辑并连接到mysql db并执行查询。我想知道如果客户端取消请求,如何使用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 

 }

1 个答案:

答案 0 :(得分:2)

除了阅读Context blog post本身以外,我强烈建议您看一下context documentation以使自己熟悉上下文。

要解决您的特定问题:

如果用户取消他们的任务,如何取消数据库查询?

要使其正常工作,您需要检查一些事情:

  1. 确保您的数据库驱动程序(如果使用的是database/sql)支持上下文取消。
  2. 确保您使用的是所有可用方法的Context变体(例如,db.QueryContext而不是db.Query)。
  3. 确保您正在将上下文(或上下文的派生)从HTTP请求传递到数据库调用。

我需要将ctx传递给F1()吗?

上面的#3,是的:您将需要通过所有中间调用传递上下文,以将数据库调用与请求上下文“连接”。

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

问题中包含的代码与取消/超时F1串联而不是同时调用select

如果要将特定的截止日期应用于数据库调用,请使用context.WithTimeout来限制所需的时间。否则,您无需执行任何特殊操作:只需根据您的上下文调用F1,其余的事情将为您发生,不需要select