实现生产者-消费者模型

🟡 中等

题目描述

使用 channel 实现一个生产者-消费者模型,支持多个生产者和消费者。

参考答案

func ProducerConsumer(producers, consumers, items int) {
    jobs := make(chan int, items)
    results := make(chan int, items)
    
    // 启动生产者
    for i := 0; i < producers; i++ {
        go func(id int) {
            for j := 0; j < items/producers; j++ {
                job := id*100 + j
                jobs <- job
                fmt.Printf("Producer %d: produced %d\n", id, job)
            }
        }(i)
    }
    
    // 启动消费者
    for i := 0; i < consumers; i++ {
        go func(id int) {
            for job := range jobs {
                result := job * 2
                results <- result
                fmt.Printf("Consumer %d: consumed %d, result %d\n", id, job, result)
            }
        }(i)
    }
    
    // 等待所有生产者完成
    time.Sleep(time.Second)
    close(jobs)
    
    // 收集结果
    for i := 0; i < items; i++ {
        <-results
    }
}

关键点

  1. 缓冲 channel:解耦生产者和消费者
  2. 关闭 channel:通知消费者结束
  3. range 遍历:自动检测 channel 关闭