猿问

在后台处理时响应 HTTP 请求

我有一个 API,它接收要处理的 CSV 文件。我希望能够在后台处理文件时发回(或任何状态)。我有一个处理程序,它检查请求,写入成功标头,然后通过生产者/消费者模式继续处理。问题是,由于调用,接受的标头不会发送回去。处理程序验证上的错误正在正确发送回去,但这是由于语句造成的。202 AcceptedWaitGroup.Wait()return


是否可以像我希望的那样与等待组一起将其发回(如果是这样,我错过了什么)?202 Accepted


func 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.")

}


郎朗坤
浏览 156回答 1
1回答

犯罪嫌疑人X

您正在后台执行所有处理,但仍在等待它完成。解决办法就是不要等待。最好的解决方案是将所有处理转移到其他地方,你可以调用一个函数在后台运行它,但最简单的解决方案是让它内联gow.WriteHeader(http.StatusAccepted)go func() {&nbsp; &nbsp; // START PRODUCER/CONSUMER&nbsp; &nbsp; jobs := make(chan *Job, 100)&nbsp; &nbsp; // buffered channel&nbsp; &nbsp; results := make(chan *Job, 100) // buffered channel&nbsp; &nbsp; // start consumers&nbsp; &nbsp; for i := 0; i < 5; i++ { // 5 consumers&nbsp; &nbsp; &nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; &nbsp; &nbsp; go consume(i, jobs, results)&nbsp; &nbsp; }&nbsp; &nbsp; // start producing&nbsp; &nbsp; go produce(jobs, csvFile)&nbsp; &nbsp; // start processing&nbsp; &nbsp; wg2.Add(1)&nbsp; &nbsp; go process(results)&nbsp; &nbsp; wg.Wait() // wait for all workers to finish processing jobs&nbsp; &nbsp; close(results)&nbsp; &nbsp; wg2.Wait() // wait for process to finish&nbsp; &nbsp; log.Println("===> Done Processing.")}()请注意,您省略了 CSV 文件处理,因此您需要确保以这种方式使用是安全的(即,您尚未关闭或删除文件,这将导致在处理程序返回后立即发生这种情况)。defer
随时随地看视频慕课网APP

相关分类

Go
我要回答