溫馨提示×

高效并發(fā)編程:使用Go WaitGroup和協(xié)程池

小云
101
2023-10-08 14:29:28
欄目: 編程語言

在Go語言中,可以使用WaitGroup和協(xié)程池來實(shí)現(xiàn)高效的并發(fā)編程。

  1. WaitGroup:WaitGroup是一個計數(shù)器,用于等待一組協(xié)程的完成。在主協(xié)程中添加計數(shù)器的數(shù)量,然后在每個協(xié)程中完成任務(wù)后減少計數(shù)器的數(shù)量。主協(xié)程可以使用Wait方法等待所有協(xié)程完成任務(wù)。

下面是一個使用WaitGroup的示例代碼:

package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
// 第一個協(xié)程的任務(wù)
fmt.Println("協(xié)程1完成")
}()
go func() {
defer wg.Done()
// 第二個協(xié)程的任務(wù)
fmt.Println("協(xié)程2完成")
}()
wg.Wait()
fmt.Println("所有協(xié)程完成")
}

輸出結(jié)果為:

協(xié)程2完成
協(xié)程1完成
所有協(xié)程完成
  1. 協(xié)程池:協(xié)程池是一組可重用的協(xié)程,用于執(zhí)行并發(fā)任務(wù)。通過限制協(xié)程的數(shù)量,可以避免創(chuàng)建過多的協(xié)程導(dǎo)致系統(tǒng)資源耗盡。

下面是一個簡單的協(xié)程池的實(shí)現(xiàn)示例:

package main
import (
"fmt"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
// 處理任務(wù)的邏輯
fmt.Println("worker", id, "開始處理任務(wù)", j)
results <- j * 2
fmt.Println("worker", id, "完成任務(wù)", j)
}
}
func main() {
const numJobs = 5
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
// 啟動3個協(xié)程池
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
// 添加任務(wù)到任務(wù)通道
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
// 讀取任務(wù)結(jié)果
for r := 1; r <= numJobs; r++ {
fmt.Println(<-results)
}
}

輸出結(jié)果為:

worker 3 開始處理任務(wù) 1
worker 1 開始處理任務(wù) 2
worker 2 開始處理任務(wù) 3
worker 1 完成任務(wù) 2
worker 1 開始處理任務(wù) 4
worker 2 完成任務(wù) 3
worker 3 完成任務(wù) 1
worker 1 完成任務(wù) 4
worker 2 開始處理任務(wù) 5
worker 2 完成任務(wù) 5
2
4
6
8
10

這個示例中,我們啟動了3個協(xié)程池,每個協(xié)程池會不斷從任務(wù)通道中獲取任務(wù)并處理。任務(wù)結(jié)果會被發(fā)送到結(jié)果通道中,最后讀取結(jié)果通道中的結(jié)果。

通過使用WaitGroup和協(xié)程池,我們可以高效地實(shí)現(xiàn)并發(fā)編程,并充分利用多核處理器的性能。

0