怎么使用go并發(fā)處理同樣的數(shù)據(jù)

go
小億
90
2023-11-01 12:12:49

在Go語(yǔ)言中,可以使用goroutine和channel來(lái)實(shí)現(xiàn)并發(fā)處理同樣的數(shù)據(jù)。下面是一個(gè)簡(jiǎn)單的示例:

package main

import (
	"fmt"
	"sync"
)

func processData(data int, wg *sync.WaitGroup, resultChan chan int) {
	defer wg.Done()

	// 在這里進(jìn)行數(shù)據(jù)處理的邏輯,這里簡(jiǎn)單地將數(shù)據(jù)乘以2
	result := data * 2

	// 將處理結(jié)果發(fā)送到結(jié)果通道
	resultChan <- result
}

func main() {
	// 創(chuàng)建一個(gè)等待組和結(jié)果通道
	var wg sync.WaitGroup
	resultChan := make(chan int)

	data := []int{1, 2, 3, 4, 5}

	// 啟動(dòng)goroutine并發(fā)處理數(shù)據(jù)
	for _, d := range data {
		wg.Add(1)
		go processData(d, &wg, resultChan)
	}

	// 等待所有g(shù)oroutine完成
	go func() {
		wg.Wait()
		close(resultChan)
	}()

	// 從結(jié)果通道中讀取處理結(jié)果
	for result := range resultChan {
		fmt.Println(result)
	}
}

在上面的示例中,首先創(chuàng)建了一個(gè)等待組和一個(gè)結(jié)果通道。然后,使用go關(guān)鍵字啟動(dòng)多個(gè)goroutine并發(fā)處理數(shù)據(jù)。每個(gè)goroutine都會(huì)調(diào)用processData函數(shù)進(jìn)行數(shù)據(jù)處理,并將處理結(jié)果發(fā)送到結(jié)果通道。在主函數(shù)中,通過(guò)啟動(dòng)一個(gè)匿名goroutine來(lái)等待所有的goroutine完成,并關(guān)閉結(jié)果通道。最后,通過(guò)range resultChan循環(huán)來(lái)讀取結(jié)果通道中的處理結(jié)果并輸出。

0