Golang 并发编程Demo2 模拟多消费者队列
时间:2025-1-10 16:54 作者:杨佳乐 分类: Golang
package main
import (
"fmt"
"sync"
//"time"
)
//模拟多个工作者与任务队列
//模拟了一个工作池,其中有多个工作者处理多个任务。通过 select,每个工作者可以从任务队列中接收任务并处理。
// 工作者消费方法
func worker(id int,jobs <-chan string,results chan<- string,wg *sync.WaitGroup){
// jobs 为待消费队列,所以这里只需要读取
// results 为消费后结果,这里只需要写入
//消费后执行一次任务完成
defer wg.Done()
for job := range jobs {
//模拟处理工作
//工作处理完成
results <- fmt.Sprintf("工作者 %d 完成任务, %s",id,job)
}
}
func main(){
var wg sync.WaitGroup
// 创建任务队列
jobs := make(chan string,5)
//创建结果队列
results := make(chan string,5)
// 启动worker
for i := 0; i<=3; i++{
wg.Add(1)
go worker(i,jobs,results,&wg)
}
//向队列中添加任务
for i := 1; i<=5; i++ {
jobs <- fmt.Sprintf("任务 %d",i)
}
close(jobs) // 关闭任务队列,表示没有更多任务
go func(){
wg.Wait()
close(results) // 执行完毕,关闭结果通道
}()
// 打印结果
for result := range results{
fmt.Println(result)
}
}