Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在后台处理时响应HTTP请求_Http_Go - Fatal编程技术网

在后台处理时响应HTTP请求

在后台处理时响应HTTP请求,http,go,Http,Go,我有一个API,它接收CSV文件进行处理。我希望能够在后台处理文件时发回一个已接受的202(或任何状态)。我有一个处理程序,它检查请求,写入成功头,然后通过生产者/消费者模式继续处理。问题是,由于WaitGroup.Wait()调用,接受的头没有发送回。处理程序验证中的错误正在正确发回,但这是由于return语句造成的 有没有可能像我所希望的那样,将202接受的与等待组一起发送回去(如果有,我遗漏了什么) func SomeHandler(w http.ResponseWriter,req*ht

我有一个API,它接收CSV文件进行处理。我希望能够在后台处理文件时发回一个已接受的
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是针对这一点制定的:“[…剪裁…]表示已接受请求进行处理,但处理尚未完成;事实上,处理可能尚未开始。”