gpt4 book ai didi

http - 如何正确关闭请求并在后台继续处理它

转载 作者:IT王子 更新时间:2023-10-29 01:09:37 24 4
gpt4 key购买 nike

对于传入的 HTTP 请求,我必须以 202 Accepted 响应状态代码,同时继续在后台处理有效负载。例如,这就是我目前正在做的事情:

package main

import (
"fmt"
"log"
"net/http"
"time"

"github.com/nbari/violetear"
)

func sleep() {
time.Sleep(3 * time.Second)
fmt.Println("done...")
}

func index(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusAccepted)
go sleep()
}

func main() {
router := violetear.New()
router.HandleFunc("*", index)

http.Handle("/", router)
log.Fatal(http.ListenAndServe(":8080", router))
}

基本上,在处理程序上,我只使用 WriteHeader,然后在 goroutine 中调用 sleep 函数:

func index(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusAccepted)
go sleep()
}

如果我想回复“200 OK”,我注意到我可以简单地返回,例如:

func index(w http.ResponseWriter, r *http.Request) {
go sleep()
return
}

因此想知道我是否应该总是返回我想关闭:

func index(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusAccepted)
go sleep()
return
}

或者只需编写 header 然后调用 goroutine 就足够了。

最佳答案

从处理程序返回就足够了,这是应该做的。引自 http.Handler :

Returning signals that the request is finished; it is not valid to use the ResponseWriter or read from the Request.Body after or concurrently with the completion of the ServeHTTP call.

请注意,最后的 return 语句不是必需的,您可以忽略它。当执行最后一条语句时,执行从处理程序返回,执行不会等待从函数启动的 goroutines 完成。 (请注意,deferred 语句将在之前执行,但此处没有。)

此外,返回时,如果未设置 HTTP header ,将自动设置 200 OK。因此,如果您想要 202 Accepted,以下是最低要求:

func index(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusAccepted)
go sleep()
}

只要确保在从处理程序返回后不要在并发 goroutine 中使用 http.ResponseWriterhttpRequest 值,因为它们可能会被重用,所以你甚至不应该尝试阅读它们。

关于http - 如何正确关闭请求并在后台继续处理它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39202768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com