goroutine
sync.WaitGroup
其實 go 里面也提供了更簡單的方式 —— 使用 sync.WaitGroup。
WaitGroup 顧名思義,就是用來等待一組操作完成的。WaitGroup 內(nèi)部實現(xiàn)了一個計數(shù)器,用來記錄未完成的操作個數(shù),它提供了三個方法:
Add() 用來添加計數(shù)
Done() 用來在操作結(jié)束時調(diào)用,使計數(shù)減一
Wait() 用來等待所有的操作結(jié)束,即計數(shù)變?yōu)?0,該函數(shù)會在計數(shù)不為 0 時等待,在計數(shù)為 0 時立即返回
package main
?import(
???"fmt"
??"sync"
?)
?func main() {
??var wg sync.WaitGroup
??wg.Add(2) //因為有兩個動作,所以增加2個計數(shù)
??go func() {
????fmt.Println("Goroutine 1")
????wg.Done() //操作完成,減少一個計數(shù)
??}()
??go func() {
????fmt.Println("Goroutine 2")
????wg.Done() //操作完成,減少一個計數(shù)
??}()
??wg.Wait() //等待,直到計數(shù)為0
}
管道實現(xiàn)同步
package main
?import(
???"fmt"
?)
?func main() {
???ch := make(chan struct{})
??count := 2 //count 表示活動的協(xié)程個數(shù)
??go func() {
????fmt.Println("Goroutine 1")
????ch <- struct{}{} //協(xié)程結(jié)束,發(fā)出信號
??}()
??go func() {
????fmt.Println("Goroutine 2")
????ch <- struct{}{} //協(xié)程結(jié)束,發(fā)出信號
??}()
??for range ch {
????//每次從ch中接收數(shù)據(jù),表明一個活動的協(xié)程結(jié)束
????count--
????//當(dāng)所有活動的協(xié)程都結(jié)束時,關(guān)閉管道
????ifcount == 0 {
??????close(ch)
????}
??}
}
Sleep 一段時間
package main
?import(
???"fmt"
??"time"
?)
?func main() {
???go func() {
????fmt.Println("Goroutine 1")
??}()
??go func() {
????fmt.Println("Goroutine 2")
??}()
??time.Sleep(time.Second * 1) //睡眠1秒,等待上面兩個協(xié)程結(jié)束
}