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