我想知道在退出程序之前等待程序完成的正确方法是什么。阅读其他一些答案似乎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
}
我在这里有两个问题:
&lt; - 完成的原因是什么?
如果我取消注释最后一行会怎样?我有一个死锁错误。这是因为频道是空的,没有其他功能向它发送值吗?
答案 0 :(得分:5)
为什么<- done
可以使用?
如果我取消注释最后一行会怎样?
奖励,如果你对内存的限制非常有限,你可以使用done := make(chan struct{})
和done <- struct{}{}
,struct{}
保证使用0内存。
答案 1 :(得分:5)
收听频道<- done
是阻止操作,因此您的程序将不会继续发送,直到发送真或假,即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")
}