当所有goroutines完成时退出程序

her*_*ain 0 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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

createData()创建并发送数据到dataChan基于一些变量它最终会设置datafalse通过返回一遍又一遍,并导致程序举行公开和停止创造更多的数据,但我觉得应该有一个更清洁的方式,让我所有addData()goroutines完成后退出.我见过人们为此使用了一个频道,但我不确切地知道我将调用该函数的次数.

更新:工作代码

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()
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

two*_*two 6

sync.WaitGroup就是你想要的.你wg.Add(1)开始每个够程(或之前wg.Add(n),如果你知道计数结束前),wg.Done()在每个程序完成后,并 wg.Wait()main等待,直到所有的光洁度.链接的文档有一个例子,正如文档所说,复制它不会做你想要的; 您可能希望将变量设为指针(wg := new(sync.WaitGroup)).