在Go語言中可以使用goroutine和channel來實現(xiàn)并發(fā)處理同樣的數(shù)據(jù)。下面是一個示例代碼:
package main
import (
"fmt"
"sync"
)
func process(data int, wg *sync.WaitGroup, result chan<- int) {
// 處理數(shù)據(jù)的邏輯
// ...
// 將處理結(jié)果發(fā)送到結(jié)果通道
result <- data * 2
// 完成一個goroutine的工作,減少WaitGroup的計數(shù)
wg.Done()
}
func main() {
// 創(chuàng)建一個WaitGroup來等待所有g(shù)oroutine完成
var wg sync.WaitGroup
// 創(chuàng)建一個結(jié)果通道
result := make(chan int)
// 設置并發(fā)的goroutine數(shù)量
concurrency := 5
// 啟動goroutine進行并發(fā)處理
for i := 0; i < concurrency; i++ {
// 增加WaitGroup的計數(shù)
wg.Add(1)
// 啟動一個goroutine進行處理
go process(i, &wg, result)
}
// 等待所有g(shù)oroutine完成
wg.Wait()
// 關閉結(jié)果通道
close(result)
// 從結(jié)果通道讀取結(jié)果并打印
for r := range result {
fmt.Println("Result:", r)
}
}
在上面的示例代碼中,我們通過使用sync.WaitGroup
來等待所有的goroutine完成。每個goroutine在處理完數(shù)據(jù)后,將結(jié)果發(fā)送到結(jié)果通道result
中。最后,我們使用for range
循環(huán)從結(jié)果通道中讀取結(jié)果并進行打印。
需要注意的是,如果不使用sync.WaitGroup
來等待所有g(shù)oroutine完成的話,可能會導致主goroutine提前退出,從而導致一些goroutine的工作被中斷。因此,為了確保所有的goroutine都能完成工作,我們需要使用sync.WaitGroup
來協(xié)調(diào)它們的執(zhí)行。