我有两个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基于一些变量它最终会设置data到false通过返回一遍又一遍,并导致程序举行公开和停止创造更多的数据,但我觉得应该有一个更清洁的方式,让我所有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)
sync.WaitGroup就是你想要的.你wg.Add(1)开始每个够程(或之前wg.Add(n),如果你知道计数结束前),wg.Done()在每个程序完成后,并 wg.Wait()在main等待,直到所有的光洁度.链接的文档有一个例子,正如文档所说,复制它不会做你想要的; 您可能希望将变量设为指针(wg := new(sync.WaitGroup)).