当所有goroutines完成时退出程序

时间:2017-08-18 03:02:56

标签: 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() goroutine完成时退出。我见过人们为此使用了一个频道,但我不确切地知道我将调用该函数的次数。

更新:工作代码

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()
    }
  }
}

1 个答案:

答案 0 :(得分:6)

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