为了账号安全,请及时绑定邮箱和手机立即绑定

在后台处理时响应 HTTP 请求

在后台处理时响应 HTTP 请求

Go
郎朗坤 2022-08-01 18:39:58
我有一个 API,它接收要处理的 CSV 文件。我希望能够在后台处理文件时发回(或任何状态)。我有一个处理程序,它检查请求,写入成功标头,然后通过生产者/消费者模式继续处理。问题是,由于调用,接受的标头不会发送回去。处理程序验证上的错误正在正确发送回去,但这是由于语句造成的。202 AcceptedWaitGroup.Wait()return是否可以像我希望的那样与等待组一起将其发回(如果是这样,我错过了什么)?202 Acceptedfunc SomeHandler(w http.ResponseWriter, req *http.Request) {    endAccepted := time.Now()    err := verifyRequest(req)    if err != nil {        w.WriteHeader(http.StatusBadRequest)        data := JSONErrors{Errors: []string{err.Error()}}        json.NewEncoder(w).Encode(data)        return    }    // ...FILE RETRIEVAL CLIPPED (not relevant)...    // e.g. csvFile, openErr := os.Open(tmpFile.Name())    //////////////////////////////////////////////////////    // TODO this isn't sending due to the WaitGroup.Wait()s below    w.WriteHeader(http.StatusAccepted)    //////////////////////////////////////////////////////    // START PRODUCER/CONSUMER    jobs := make(chan *Job, 100)    // buffered channel    results := make(chan *Job, 100) // buffered channel    // start consumers    for i := 0; i < 5; i++ { // 5 consumers        wg.Add(1)        go consume(i, jobs, results)    }    // start producing    go produce(jobs, csvFile)    // start processing    wg2.Add(1)    go process(results)    wg.Wait() // wait for all workers to finish processing jobs    close(results)    wg2.Wait() // wait for process to finish    log.Println("===> Done Processing.")}
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

您正在后台执行所有处理,但仍在等待它完成。解决办法就是不要等待。最好的解决方案是将所有处理转移到其他地方,你可以调用一个函数在后台运行它,但最简单的解决方案是让它内联go


w.WriteHeader(http.StatusAccepted)

go func() {

    // START PRODUCER/CONSUMER

    jobs := make(chan *Job, 100)    // buffered channel

    results := make(chan *Job, 100) // buffered channel


    // start consumers

    for i := 0; i < 5; i++ { // 5 consumers

        wg.Add(1)

        go consume(i, jobs, results)

    }

    // start producing

    go produce(jobs, csvFile)


    // start processing

    wg2.Add(1)

    go process(results)


    wg.Wait() // wait for all workers to finish processing jobs


    close(results)


    wg2.Wait() // wait for process to finish


    log.Println("===> Done Processing.")

}()

请注意,您省略了 CSV 文件处理,因此您需要确保以这种方式使用是安全的(即,您尚未关闭或删除文件,这将导致在处理程序返回后立即发生这种情况)。defer


查看完整回答
反对 回复 2022-08-01
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信