Go协程与通道的综合应用问题
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup, jobs <-chan int, results chan<- int) {
defer wg.Done() // 确保该协程结束时通知主协程
for job := range jobs {
// 模拟耗时工作
fmt.Println("Worker", id, "started job", job)
time.Sleep(time.Second)
fmt.Println("Worker", id, "finished job", job)
results <- job * 2 // 发送结果到results通道
}
}
func main() {
var wg sync.WaitGroup
jobs := make(chan int, 100) // 创建一个缓冲为100的通道
results := make(chan int, 100) // 创建一个缓冲为100的通道
// 这里启动了4个工作协程
for i := 1; i <= 4; i++ {
wg.Add(1)
go worker(i, &wg, jobs, results)
}
// 发送10个作业
for j := 1; j <= 10; j++ {
jobs <- j
}
close(jobs) // 关闭jobs通道,表示不会再有新的作业
// 等待所有作业完成
wg.Wait()
close(results) // 所有作业完成后,关闭results通道
// 打印结果
for result := range results {
fmt.Println(result)
}
}
这段代码创建了一个工作池,其中有4个工作协程处理作业。主协程发送10个作业并关闭作业通道,工作协程处理完作业后,将结果发送到结果通道,并在所有作业处理完成后关闭结果通道。最后,主协程打印所有结果。这个例子展示了Go语言中协程和通道的基本使用方法,以及如何有效地进行并发任务处理。
评论已关闭