Go的sync.WaitGroup
可用來等待所有的goroutine都執行結束。
範例
下面使用多個goroutine來處理多筆訊息,並利用WaitGroup等待所有的goroutine結束後才結束main程式。
WaitGroup
的方法說明:
WaitGroup.Add
- 增加WaitGroup的goroutine計數,每多一個goroutine則加一。WaitGroup.Done
- 扣除WaitGroup的goroutine計數,當一個goroutine結束時減一。WaitGroup.Wait
- 當WaitGroup計數為0之前會進行阻塞;當WaitGroup計數變為0,代表所有的goroutine都執行結束,便會解除阻塞讓程式繼續往下執行。
main.go
package main
import (
"fmt"
"sync"
"time"
)
func main() {
msgs := genMessages() // 產生多筆訊息
var wg sync.WaitGroup // 建立WaitGroup物件
// 每一筆訊息都由一個goroutine處理
for _, msg := range msgs {
wg.Add(1) // 每多一個goroutine,就在WaitGroup計數加一
go func(msg string) {
defer wg.Done() // 當一個goroutine結束,就從WaitGroup計數扣除
time.Sleep(time.Second * 1) // 模擬處理每筆訊息要耗費的時間
fmt.Println(msg)
}(msg)
}
wg.Wait() // 當WaitGroup的計數為0之前,會阻塞。
}
func genMessages() []string {
msgs := make([]string, 0)
for i := 0; i < 10; i++ {
msgs = append(msgs, fmt.Sprintf("message %d", i))
}
return msgs
}
沒有留言:
張貼留言