如何在Golang中等待goroutine完成?
我們知道,**goroutine** 初學時可能有點棘手,我們經常會遇到主**goroutine** 退出而內部 goroutine 沒有機會執行的情況。
為了能夠執行**goroutine** 直到完成,我們可以使用充當阻塞器的通道,或者使用Go的**sync**包提供的**WaitGroup**。
讓我們首先探討一個只有一個**goroutine**需要完成然後執行其他工作的案例。
示例1
考慮以下程式碼。
package main import ( "fmt" ) func check(ch chan bool){ fmt.Println("Inside check") ch <- true } func main() { ch := make(chan bool) go func(){ check(ch) }() <-ch fmt.Println("Done") }
在上面的程式碼中,`<-ch`這一行是最重要的,如果我們將其刪除,則**匿名goroutine**將無法正常執行。
輸出
執行程式碼時,它將在終端中生成以下輸出。
Inside check Done
在上面的程式碼中,我們看到只有一個**goroutine**的案例,但讓我們考慮一個有多個**goroutine**並且我們想要等待所有goroutine完成的案例。
示例2
考慮以下程式碼。
package main import ( "fmt" "sync" ) func check(count int, wg *sync.WaitGroup) { defer wg.Done() fmt.Println("Inside check", count) } func main() { count := 3 var wg sync.WaitGroup wg.Add(count) for i := 1; i <= count; i++ { go check(i, &wg) } wg.Wait() fmt.Println("Done") }
在上面的程式碼中,我們在for迴圈內啟動了多個**goroutine**,並將**WaitGroup**作為引數傳遞給**check**函式。允許我們等待這些**goroutine**完成的最重要部分是**Wait()**函式。
輸出
執行程式碼時,它將在終端中生成以下輸出。
Inside check 3 Inside check 2 Inside check 1 Done
需要注意的是,上面goroutine中**count**的順序可能會有所不同,但可以肯定的是,只有在所有**goroutine**都執行完畢後,才會列印“**Done**”。
廣告