gpt4 book ai didi

http - 如何在执行响应中不需要的计算之前向客户端发送响应

转载 作者:IT王子 更新时间:2023-10-29 02:20:36 24 4
gpt4 key购买 nike

我们可以发送响应(或写在用户端),声明如下:

json.NewEncoder(w).Encode("some data")

在 api 之前做一些计算部分,这些部分在响应中不需要,但需要存储在数据库中。我在想我们可以在更短的时间内给用户做出响应,并且功能的其他部分将继续工作直到 return 语句。

如果我想错了方向,请纠正我。

最佳答案

一种方法是在另一个 goroutine 中做响应不需要的额外工作:

func someHandler(w http.ResponseWriter, r *http.Request) {
go func() {
// Do anything here, this won't delay the response
// But don't touch the writer or request, as they may not be available here
}()

if err := json.NewEncoder(w).Encode("some data"); err != nil {
log.Printf("Error sending response: %v", err)
}
}

请注意,在启动的 gorotuine 中,您不能使用 http.ResponseWriterhttp.Request,因为它们只有在您返回之前才有效处理程序。如果你需要他们的东西,你必须在启动 goroutine 之前复制所需的部分。

如果你想在从处理程序返回之前完成额外的任务,你仍然可以使用一个 goroutine,并使用一个 sync.WaitGroup 来等待它完成,然后才从处理程序。您可能会也可能不会刷新响应:

func someHandler(w http.ResponseWriter, r *http.Request) {
wg := &sync.WaitGroup{}
wg.Add(1)
go func() {
defer wg.Done()

// You may use the writer and request here
}()

if err := json.NewEncoder(w).Encode("some data"); err != nil {
log.Printf("Error sending response: %v", err)
}

// Optionally you may flush the data written so far (icnluding HTTP headers)
if flusher, ok := w.(http.Flusher); ok {
flusher.Flush()
}

wg.Wait()
}

请注意,这里允许 goroutine 使用 http.ResponseWriterhttp.Request,因为在附加任务完成之前处理程序不会返回。

关于http - 如何在执行响应中不需要的计算之前向客户端发送响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51514982/

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