以Golang为例
借助channel(本质是一个FIFO的队列)来进行通信,符合golang“通过通信来共享内存”的并发哲学。
实现步骤包括以下几个关键点。
- 通过
go
关键字分别为每一个生产者和消费者创建goroutine。 - 通过
sync.WaitGroup
来控制整个模型的运行结束时刻,具体方法为:每启动一个生产者/消费者goroutine,都执行Add(1)
;每个生产者/消费者在程序最后通过执行Wait()
来阻塞等待所有goroutine运行完成。 - 通过
chan
来创建拥有初始缓冲池的channel,生产者在自己的goroutine函数中向channel写入数据,消费者在自己的goroutine函数中从channel中读出数据,若消费者从管道读取数据失败(消费速度快于生产速度,管道无数据),则循环重试。由于channel本身是线程安全的,所以多个goroutine可以同时修改一个channel,不需要加锁。