Python 生产者消费者模式详解与代码实现
本文详细介绍 Python 中的生产者消费者模式,旨在解决多线程开发中的速度不平衡问题。通过阻塞队列解耦生产与消费线程,提升程序处理效率。文章包含基础代码案例及优化方案,展示如何利用 queue 模块实现异步执行与解耦。
Python 的生产者和消费者模式
一、生产者消费者模式概述
在并发编程领域,采用生产者消费者模式能够有效解决大多数并发场景下的问题。该模式的核心在于平衡生产线程与消费线程的工作负载,从而提升程序整体处理数据的速度。
二、为什么使用生产者消费者模式
在线程模型中,生产者指负责生成数据的线程,消费者指负责处理数据的线程。在多线程开发过程中,若生产者处理速度远快于消费者,生产者将被迫等待消费者处理完毕才能继续生成数据;反之,若消费者处理能力强于生产者,消费者则需等待生产者提供数据。为了解决这种速度不匹配导致的等待问题,引入了生产者消费者模式。
三、什么是生产者消费者模式
生产者消费者模式借助一个共享容器来解除生产者和消费者之间的强耦合关系。双方不直接进行通信,而是通过阻塞队列进行交互。生产者生成数据后,无需等待消费者处理,直接将数据放入阻塞队列;消费者也不依赖生产者的状态,而是直接从阻塞队列中获取数据。该队列充当缓冲区,有效平衡了生产者和消费者的处理能力。

四、代码案例
1、定义一个生产者
import threading
import queue
import time
#定义一个生产者
def producer():
count = 0
#判断队列中任务的数量
while q.qsize()<5:
print('第%s顿饭......',count)
q.put(count)
count+=1
time.sleep(1)
2、定义一个消费者
import threading
import queue
import time
#定义一个消费者
def consumer(name):
while True:
print("%s 吃了第%s饭" % (name,q.get()))
3、定义一个队列
import threading
import queue
import time
#定义一个队列
q = queue.Queue(maxsize=4)
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer,args=('jibu',))
t1.start()
t2.start()
结果:
第%s顿饭...... 0
jibu 吃了第0饭
第%s顿饭...... 1
jibu 吃了第1饭
第%s顿饭...... 2
jibu 吃了第2饭
第%s顿饭...... 3
jibu 吃了第3饭
第%s顿饭...... 4
jibu 吃了第4饭
第%s顿饭...... 5
jibu 吃了第5饭
第%s顿饭...... 6
jibu 吃了第6饭
第%s顿饭...... 7
jibu 吃了第7饭
第%s顿饭...... 8
# 另外,如果供大于求或者求大于供,可以在相对小的一方在增加线程的数量
当然如果需要进一步优化可以让消费者执行完队列中所有任务的时候告诉生产者一声
import threading
import queue
import time
#定义一个生产者
def producer():
count = 0
#判断队列中任务的数量
for i in range(5):
print('第%s顿饭......',count)
q.put(count)
count+=1
time.sleep(1)
q.join()
#定义一个消费者
def consumer(name):
while True:
print("%s 吃了第%s饭" % (name,q.get()))
q.task_done()
print('消费者执行完了所有任务')
#定义一个队列
q = queue.Queue(maxsize=4)
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer,args=('jibu',))
t1.start()
t2.start()
结果
第0顿饭......
jibu 吃了第0饭
消费者执行完了所有任务
第1顿饭......
jibu 吃了第1饭
消费者执行完了所有任务
第2顿饭......
jibu 吃了第2饭
消费者执行完了所有任务
第3顿饭......
jibu 吃了第3饭
消费者执行完了所有任务
第4顿饭......
jibu 吃了第4饭
消费者执行完了所有任务
结论:
生产者消费者的2个主要作用
- 程序的解耦合
- 程序的异步执行,提高了程序的运行效率(在排队的时候可以做别的事,过一会可以回来拿这个结果)
到此这篇关于python 的生产者和消费者模式的文章就介绍到这了,更多相关python生产者消费者模式内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









