0

我有一项服务,用户可以将数据导出到我在后端服务器上为他们生成的 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 中的并发性,但我显然遗漏了一些东西。谁能帮我吗?

4

0 回答 0