«

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)
    }

}