我有一项服务,用户可以将数据导出到我在后端服务器上为他们生成的 excel 文件中。有时这些出口可能很大。因此,作为一种牢记用户体验的方法,我想确认服务器收到了请求并响应正在生成文档,并将在完成后通过电子邮件发送给他们。
这是迄今为止我所拥有的一个简单的例子。
代码:
func generateDocx(n int, wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 10; i++ {
amt := time.Duration(rand.Intn(250))
time.Sleep(time.Millisecond * amt)
fmt.Println("Export: ", n, "Document number:", i)
}
}
func ExportService() {
wg := &sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go generateDocx(i, wg)
}
wg.Wait()
// email user after all documents are generated
fmt.Println("Sending email that documents are ready")
}
func main() {
finish := make(chan bool)
// var input string
// fmt.Scanln(&input)
router := mux.NewRouter()
type Reply struct {
Title string
Message string
}
router.HandleFunc("/export", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
fmt.Println("starting generation")
ExportService()
json.NewEncoder(w).Encode(&Reply{
Title: "Generating",
Message: "Your files are being generated, you will recieve an email when the files are ready.",
})
fmt.Println("responded")
})
log.Fatal(http.ListenAndServe(":8080", router))
<-finish
}
当端点被击中时:
starting generation
Export: 8 Document number: 0
Export: 6 Document number: 0
Export: 9 Document number: 0
Export: 6 Document number: 1
Export: 4 Document number: 0
Export: 3 Document number: 0
Export: 2 Document number: 0
Export: 1 Document number: 0
Export: 3 Document number: 1
Export: 0 Document number: 0
Export: 6 Document number: 2
ect...
Sending email that documents are ready
responded
即使等待组在 ExportService 中并且不向处理程序返回任何内容,响应仍会等待生成完成,然后再以成功消息进行响应。
我想说我理解 Go 中的并发性,但我显然遗漏了一些东西。谁能帮我吗?