如何杀死执行例程而不是通道?

时间:2019-05-19 20:48:51

标签: go goroutine

我有一个工作ID的集合,我必须为其提供数据。每个作业ID响应都可能返回3页。得到所有答复后,我将提取一些道具并将其写入csv文件。

如果响应元数据表明它是x的第1页,我想递归地调用一个函数来获取此数据。

一旦我拥有x的x页,我将不再希望调用该例程,当所有例程完成后,我将继续执行应用程序逻辑。

我一直在研究go例程和渠道,作为处理这种流程的一种方式。

func (c *Controller) GetBulkJobProps() http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        jobs := models.BulkJobListIDs{}
        json.NewDecoder(r.Body).Decode(&jobs)

        if len(jobs.BulkSendJobs) == 0 {
            err := models.Error{}
            err.Message = "Missing bulk job id(s)"
            utils.SendError(w, 400, err)
            return
        }

        c := make(chan string)

        for _, id := range jobs.BulkSendJobs {
            go getLink(id, 1, c)
        }

        for l := range c {
            go func(id string) {

                if id == "quit" {
                    close(c)
                    return
                }

                getLink(id, 2, c)
            }(l)
        }

        filename := time.Now().Format("02-01-2006_15:04:05")

        utils.CreateCSV(filename, csvResponse)

        csvResponse = nil

        w.Header().Add("Content-Type", "application/json")
        utils.SendSuccess(w, nil)

    }
}

func getLink(id string, page int, c chan string) {
    data := utils.FetchBulkJobProps(id, page)

    for _, r := range data.SignatureRequests {
        for _, sr := range r.Signatures {
            csvResponse = append(csvResponse, []string{r.Title, sr.SignerEmailAddress, sr.StatusCode})
            if data.ListInfo.NumPages > data.ListInfo.Page {
                c <- id
                return
            }
            c <- "quit"
        }
    }
}

我希望通过确保data.ListInfo.NumPages > data.ListInfo.Page可以断言存在下一个要请求的页面,如果不是的话,我想发信号通知我的频道以某种方式结束该特定例程。

我想也许可以通过将c <- "quit"传递回通道,而不是需要后续调用的id来发信号,让我的函数字面量结束该例程。

   for l := range c {
            go func(id string) {

                if id == "quit" {
                    close(c)
                    return
                }

                getLink(id, 2, c)
            }(l)
        }

相反,这似乎使我的应用程序崩溃,因为我现在正在关闭的频道上进行发送。

0 个答案:

没有答案