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 处理程序:
立即学习“go语言免费学习笔记(深入)”;
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() }
以上就是Golang 函数:在 HTTP 处理程序中使用上下文取消的详细内容,更多请关注php中文网其它相关文章!