我有两个 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/