我有响应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
}
答案 0 :(得分:2)
除了阅读Context blog post本身以外,我强烈建议您看一下context
documentation以使自己熟悉上下文。
要解决您的特定问题:
如果用户取消他们的任务,如何取消数据库查询?
要使其正常工作,您需要检查一些事情:
database/sql
)支持上下文取消。db.QueryContext
而不是db.Query
)。我需要将ctx传递给F1()吗?
上面的#3,是的:您将需要通过所有中间调用传递上下文,以将数据库调用与请求上下文“连接”。
如何在F1()返回后立即返回?
问题中包含的代码与取消/超时F1
串联而不是同时调用select
。
如果要将特定的截止日期应用于数据库调用,请使用context.WithTimeout
来限制所需的时间。否则,您无需执行任何特殊操作:只需根据您的上下文调用F1
,其余的事情将为您发生,不需要select
。