golang 的上下文取消功能允许在 http 处理程序中取消正在进行的请求,以便处理超时请求或优雅地关闭服务器。步骤:创建一个 context 对象。将 context 传递给 http 处理程序。在处理程序中使用 context 进行超时处理或取消请求。在服务器关闭时将 context 传递给 http 服务器,以取消所有正在进行的请求。

Golang 函数:在 HTTP 处理程序中使用上下文取消
在 Golang Web 服务器中,HTTP 请求的处理经常发生在独立的 goroutine 中。使用 context 包,我们可以取消正在进行的 HTTP 处理,这对于处理超时请求或在服务器关闭时优雅地关机非常有用。
使用上下文取消
要使用上下文取消,我们需要创建一个带有 context.Context 类型的 context 对象:
ctx, cancel := context.WithCancel(context.Background())
然后,我们将 context 传递给 HTTP 处理程序:
func MyHandler(w http.ResponseWriter, r *http.Request) {
// 使用 ctx 来取消处理
}实战案例:超时请求
假设我们有一个可能需要花费较长时间处理的 HTTP 处理程序。我们可以使用上下文取消来在特定时间限制后取消该处理:
const timeout = 10 * time.Second
func MyHandler(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
// 创建一个 goroutine 来处理请求
go func() {
defer cancel()
// 处理请求...
}()
// 等待请求处理完成或超时
<-ctx.Done()
// 如果请求超时,终止 goroutine
if ctx.Err() == context.DeadlineExceeded {
log.Println("Request timed out")
return
}
// 请求处理成功,返回响应
w.Write([]byte("Response"))
}服务器关机
上下文取消也可用于在服务器关闭时优雅地关机。通过将 context 传递给 HTTP 服务器,我们可以确保在关闭时所有正在进行的请求都会被取消:
func main() {
// 创建带有取消上下文的 HTTP 服务器
ctx := context.Background()
srv := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(MyHandler),
// 当服务器关闭时取消上下文
Context: ctx,
}
// 关闭服务器
go func() {
if err := srv.Shutdown(ctx); err != nil {
log.Fatal("Server shutdown error:", err)
}
}()
// 监听 HTTP 请求
srv.ListenAndServe()
}

