如何在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**”。
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP