默认情况下,程序不会等待 goroutine 结束就退出了。 下面将讲解一种等待所有 goroutine 结束的方法:使用 sync.WaitGroup 。
使用 sync.WaitGroup¶
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup // 定义 WaitGroup
arr := [3]string{"a", "b", "c"}
for _, v := range arr {
wg.Add(1) // 增加一个 wait 任务
go func(s string) {
defer wg.Done() // 函数结束时,通知此 wait 任务已经完成
fmt.Println(s)
}(v)
}
// 等待所有任务完成
wg.Wait()
}
使用 chan¶
评论区 remones 大佬提到了另一种方法,那就是使用 chan 来实现。
package main
import "fmt"
func main() {
arr := [3]string{"a", "b", "c"}
ch := make(chan struct{}, len(arr))
for _, v := range arr {
go func(s string) {
fmt.Println(s)
ch <- struct{}{}
}(v)
}
for i := 0; i < len(arr); i++ {
<-ch
}
}
或者 remones 大佬的版本:
package main
import (
"fmt"
"time"
)
func main() {
workFn := func(n int) <-chan struct{} {
doneC := make(chan struct{})
go func(n int) {
time.Sleep(100 * time.Millisecond)
fmt.Printf("routine %d was finished.\n", n)
doneC <- struct{}{}
}(n)
return doneC
}
chs := make([]<-chan struct{}, 0, 5)
for i := 0; i < 5; i++ {
ch := workFn(i)
chs = append(chs, ch)
}
for _, ch := range chs {
<-ch
}
}
Comments