前言
记录一下我自己常用的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() }