go - 当所有 goroutines 完成时退出程序

标签 go goroutine

我有两个 go 例程函数,一个创建数据,一个将数据添加到数据库中。当我完成创建数据时,我想完成添加数据,但我不知道我要调用该函数多少次。

for {
  select {
  case c <- dataChan:
    go func() {
      if data == false {
        return // keeps the program running but never exits
      }
      createData(c.Data) // sends data to dataChan until data == false 
    }
    go func() {
      addData(c.Data) // need to keep the program running until all these goroutines finish
    }
  }
}

createData() 创建数据并将其发送到 dataChan 并根据一些变量最终将 data 设置为 false 并通过一遍又一遍地返回并停止创建更多数据来使程序保持打开状态,但我觉得应该有一种更简洁的方法让我在所有 addData() goroutines 完成。我见过人们为此使用 channel ,但我不知道我要调用该函数多少次。

更新:工作代码

var wg sync.WaitGroup
for {
  select {
  case c <- dataChan:
    wg.Add(1)
    go func() {
      if data == false {
        wg.Wait()
        os.Exit(0)
      }
      createData(c.Data)
    }
    go func() {
      addData(c.Data)
      defer wg.Done()
    }
  }
}

最佳答案

sync.WaitGroup是你想要的。您在开始每个 goroutine 之前 wg.Add(1)(如果您预先知道计数,则为 wg.Add(n)),wg.Done() 在每个例程完成时,wg.Wait()main 等待直到全部完成。链接的文档有一个例子,正如文档所指出的,复制它不会做你想要的;您可能希望将变量设为指针 (wg := new(sync.WaitGroup))。

关于go - 当所有 goroutines 完成时退出程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45747849/

相关文章:

go - CoInitializeEx(COINIT_MULTITHREADED) 和使用 WMI 的协程

multithreading - 多个 goroutine 会同时调用 Conn 上的方法吗?

go - grpc-通过 https : failed rpc error: code = Unavailable desc = transport is closing:

json - XML 到 JSON 多重嵌套

google-app-engine - GoLang/Google App Engine - 目录结构

multithreading - goroutine和thread的区别

json - Go Gin将json响应转换为base64

go - 如何更新普罗米修斯导出器(golang)中的指标值

go - golang 中的悬挂 goroutine

go - 如何暂停和恢复goroutine?