Goではデータを並列処理するにはどうしたらよいですか?
Go言語では、goroutineとチャネルを使用して、同じデータを並列に処理できます。以下にサンプルコードを示します。
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を使用し、すべてのゴルーチンが完了するまで待機しています。各ゴルーチンはデータを処理後、結果をresultチャンネルに出力します。最後に、for rangeループを使用して結果チャンネルを読み込み、その結果を出力しています。
sync.WaitGroupで全てのgoroutineが終了するのを待たないと、メインのgoroutineが先に終了してしまう可能性があり、それによって一部のgoroutineの作業が中断されてしまうことに注意してください。したがって、全てのgoroutineが作業を完了させることを確実にするため、sync.WaitGroupを使用して goroutineの実行を調整する必要があります。