在并发编程中生产者消费者模式模式可以解决大多数并发问题。该模式通过一个阻塞队列来平衡生产者和消费者之间的工作能力,以提高整体的处理速度。Go语言作为一种原生支持高并发的语言,经常使用生产者和消费者模式。

需要说明的是: 生产者和消费者模式并没有被列入GoF的23种OOP(面向对象编程)的设计模式, 是因为该模式并不是一种OOP的设计模式,而是一种面向过程的设计模式。

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)
    defer close(ch)
    // consumer
    for i := 0; i < 10; i++ {
        go func() {
            num := <- ch
            fmt.Println(num)
        }()
    }

    // product
    for i := 0; i < 10; i++ {
        go func(num int) {
            ch <- num
            fmt.Println(num)
        }(i)
    }
    time.Sleep(1 * time.Second)
}
5
0
6
7
8
9
2
1
3
4

如果生产者这样写:

for i := 0; i < 10; i++ {
    go func() {
        ch <- i
    }
}

就会形成闭包,结果为:

10
10
10
10
10
10
10
10
10
10