Golang JSON对客户端的响应,然后执行不需要响应的计算

时间:2018-07-25 09:04:58

标签: http go response goroutine

我们可以使用以下语句发送响应(或在用户端写)吗?

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中执行某些计算部分之前的

,这些部分不是响应中必需的,但需要存储在数据库中。我在想,我们可以在更少的时间内给用户响应,而函数的其他部分将继续工作,直到返回语句为止。

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

1 个答案:

答案 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.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,因为处理程序只有在完成其他任务后才返回。