我们可以使用以下语句发送响应(或在用户端写)吗?
for (i in 1:nrow(df1)){
subset_string = df1[i, 1]
target_value = df1[i, 2]
df2_subset <- df2[df2$group == subset_string, ]
for (j in 1:nrow(df2_subset)){
temp_sequence <- seq(from = df2_subset[j, 2], to = df2_subset[j, 3] - 1)
if (target_value %in% temp_sequence){
target_string <- df2_subset[j, 4]
}
df1[i, 3] <- target_string
}
}
在api中执行某些计算部分之前的,这些部分不是响应中必需的,但需要存储在数据库中。我在想,我们可以在更少的时间内给用户响应,而函数的其他部分将继续工作,直到返回语句为止。
如果我想错了方向,请纠正我。
答案 0 :(得分:0)
一种方法是执行其他工作中不需要的其他工作:
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.ResponseWriter
或http.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.ResponseWriter
和http.Request
,因为处理程序只有在完成其他任务后才返回。