前言
记录一下我自己常用的go程阻塞方法, 确认go程完成
sync.WaitGroup
主要是用来监听go程执行完成
package main
import (
"fmt"
"time"
"sync"
)
func a() {
fmt.Println("a")
time.Sleep(1 * time.Second)
}
func b() {
fmt.Println("b")
time.Sleep(2 * time.Second)
}
func test() {
xf := sync.WaitGroup{}
lis := []string{"a", "b"}
for _, x := range lis {
xf.Add(1)
go func(x string) {
defer xf.Done()
switch x {
case "a":
a()
case "b":
b()
}
}(x)
}
xf.Wait()
}
func main() {
test()
}
for循环读取chan
用读取chan的方式来阻塞等待go程结束, 也可以把go程的结果放到chan里
package main
import (
"fmt"
"time"
)
func a() {
fmt.Println("a")
time.Sleep(1 * time.Second)
}
func b() {
fmt.Println("b")
time.Sleep(2 * time.Second)
}
func test() {
task := make(chan interface{})
lis := []string{"a", "b"}
for _, x := range lis {
go func(x string) {
switch x {
case "a":
a()
case "b":
b()
}
task <- nil
}(x)
}
for a := 0; a < len(lis); a++ {
mess := <-task
fmt.Println(mess)
}
}
func main() {
test()
}