多线程编程之生产消费者模式

240 阅读2分钟

在并发编程中,使用生产消费者模式能够解决绝大多数并发问题,该模式通过平衡生产进程和消费进程的工作能力来提高程序整体处理数据的速度。

生产者和消费者是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者之间彼此不直接通信,而是通过阻塞队列(消息队列)来进行通信,所以生产者生产完数据之后不用等待消费者处理,而是直接扔给阻塞队列;消费者不找生产者获取数据,而是直接从阻塞队列获取。阻塞队列作为一个缓冲区,平衡了生产者和消费者的处理能力。

eg:

import time
import queue
import threading
​
​
# 创建阻塞队列(消息队列),长度为10
q = queue.Queue()
​
​
# 生产者
def producer(i):
    while True:
        q.put("厨师%s做的菜式!" % i)
        time.sleep(2)
​
​
# 消费者
def consumer(j):
    while True:
        print('顾客%s吃了-%s' %(j,q.get()))
​
​
if __name__ == '__main__':
    for i in range(3):
        t = threading.Thread(target=producer, args=(i,))
        t.start()
    for j in range(10):
        v = threading.Thread(target=consumer, args=(j,))
        v.start()

result:

顾客0吃了-厨师0做的菜式!
顾客0吃了-厨师1做的菜式!
顾客0吃了-厨师2做的菜式!
顾客0吃了-厨师1做的菜式!顾客2吃了-厨师0做的菜式!
顾客2吃了-厨师2做的菜式!
​
顾客3吃了-厨师1做的菜式!顾客5吃了-厨师0做的菜式!
顾客5吃了-厨师2做的菜式!
​
顾客7吃了-厨师1做的菜式!
顾客7吃了-厨师0做的菜式!
顾客8吃了-厨师2做的菜式!
顾客9吃了-厨师1做的菜式!
顾客0吃了-厨师2做的菜式!
顾客0吃了-厨师0做的菜式!

注:程序是一个死循环,这是运行过程中的 部分内容