在后台处理时响应HTTP请求
我有一个API,它接收CSV文件进行处理。我希望能够在后台处理文件时发回一个已接受的在后台处理时响应HTTP请求,http,go,Http,Go,我有一个API,它接收CSV文件进行处理。我希望能够在后台处理文件时发回一个已接受的202(或任何状态)。我有一个处理程序,它检查请求,写入成功头,然后通过生产者/消费者模式继续处理。问题是,由于WaitGroup.Wait()调用,接受的头没有发送回。处理程序验证中的错误正在正确发回,但这是由于return语句造成的 有没有可能像我所希望的那样,将202接受的与等待组一起发送回去(如果有,我遗漏了什么) func SomeHandler(w http.ResponseWriter,req*ht
202
(或任何状态)。我有一个处理程序,它检查请求,写入成功头,然后通过生产者/消费者模式继续处理。问题是,由于WaitGroup.Wait()
调用,接受的头没有发送回。处理程序验证中的错误正在正确发回,但这是由于return
语句造成的
有没有可能像我所希望的那样,将202接受的与等待组一起发送回去(如果有,我遗漏了什么)
func SomeHandler(w http.ResponseWriter,req*http.Request){
endAccepted:=时间。现在()
错误:=验证请求(req)
如果错误!=零{
w、 WriteHeader(http.StatusBadRequest)
数据:=JSONErrors{Errors:[]字符串{err.Error()}
json.NewEncoder(w).Encode(数据)
回来
}
//…文件检索已剪裁(不相关)。。。
//例如,csvFile,openErr:=os.Open(tmpFile.Name())
//////////////////////////////////////////////////////
//TODO由于下面的WaitGroup.Wait()而无法发送
w、 WriteHeader(http.StatusAccepted)
//////////////////////////////////////////////////////
//启动生产商/消费者
jobs:=make(chan*Job,100)//缓冲通道
结果:=make(chan*Job,100)//缓冲通道
//启动消费者
对于i:=0;i<5;i++{//5消费者
工作组.添加(1)
去消费(我、工作、结果)
}
//开始生产
开始生产(作业、CSV文件)
//开始处理
wg2.添加(1)
go过程(结果)
wg.Wait()//等待所有工人完成处理作业
结束(结果)
wg2.Wait()//等待进程完成
log.Println(“=>已完成处理。”)
}
您正在后台执行所有处理,但仍在等待它完成。解决办法就是不要等待。最好的解决方案是将所有处理移到一个函数,您可以使用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.")
}()
w.WriteHeader(http.StatusAccepted)
go func(){
//启动生产商/消费者
jobs:=make(chan*Job,100)//缓冲通道
结果:=make(chan*Job,100)//缓冲通道
//启动消费者
对于i:=0;i<5;i++{//5消费者
工作组.添加(1)
去消费(我、工作、结果)
}
//开始生产
开始生产(作业、CSV文件)
//开始处理
wg2.添加(1)
go过程(结果)
wg.Wait()//等待所有工人完成处理作业
结束(结果)
wg2.Wait()//等待进程完成
log.Println(“=>已完成处理。”)
}()
请注意,您省略了CSV文件处理,因此您需要确保以这种方式使用是安全的(即,您没有延迟关闭或删除文件,这将导致处理程序返回后立即关闭或删除该文件)。:“HTTP以后无法发送异步响应,指示处理请求的结果“。您无法发回最终状态。如果这不是您想要做的,那么不要阻塞处理程序,让它返回。@JimB是的,我不关心在处理后发送异步响应。将存储一个报告。202是针对这一点制定的:“[…剪裁…]表示已接受请求进行处理,但处理尚未完成;事实上,处理可能尚未开始。”