当所有 goroutines 完成时退出程序
exit program when all goroutines finish
我有两个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 完成时退出。我见过人们为此使用通道,但我不知道我要调用该函数多少次。
更新:工作代码
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 就是你想要的。你 wg.Add(1)
在开始每个 goroutine 之前(或者 wg.Add(n)
如果你知道前面的计数), wg.Done()
在每个例程完成时, wg.Wait()
在 main
到等到全部完成。链接的文档有一个例子,正如文档所指出的,复制它不会做你想要的;您可能希望将变量设为指针 (wg := new(sync.WaitGroup)
).
我有两个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 完成时退出。我见过人们为此使用通道,但我不知道我要调用该函数多少次。
更新:工作代码
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 就是你想要的。你 wg.Add(1)
在开始每个 goroutine 之前(或者 wg.Add(n)
如果你知道前面的计数), wg.Done()
在每个例程完成时, wg.Wait()
在 main
到等到全部完成。链接的文档有一个例子,正如文档所指出的,复制它不会做你想要的;您可能希望将变量设为指针 (wg := new(sync.WaitGroup)
).