我想知道在退出程序之前等待 go 例程完成的正确方法是什么。阅读其他一些答案似乎 bool chan 可以解决问题,如 Playground link
func do_stuff(done chan bool) {
fmt.Println("Doing stuff")
done <- true
}
func main() {
fmt.Println("Main")
done := make(chan bool)
go do_stuff(done)
<-done
//<-done
}
这里有两个问题:
为什么 <- done 有效?
如果我取消注释最后一行会怎样?我有一个死锁错误。这是因为 channel 是空的,没有其他函数向它发送值吗?
最佳答案
收听 channel <- done
, 是一个阻塞操作,所以你的程序不会继续,直到发送 true 或 false 即 done <- true
.
根据情况,您的问题可能有几个不同的答案。
例如,假设您想并行化一系列需要很长时间的函数调用。
我会使用 sync
为此打包
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
longOp()
wg.Done()
}()
}
// will wait until wg.Done is called 10 times
// since we made wg.Add(1) call 10 times
wg.Wait()
}
func longOp() {
time.Sleep(time.Second * 2)
fmt.Println("long op done")
}
关于go - 等待例程完成的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25954481/