python 的生产者和消费者模式
作者:季布, 时间:2021-09-18 07:19:45
目录
python 的生产者和消费者模式
一、生产者消费者模式概述
二、为什么使用生产者消费者模式
三、什么是生产者消费者模式
四、代码案例
1、定义一个生产者
2、定义一个消费者
3、定义一个队列
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个主要作用
程序的解耦合
程序的异步执行,提高了程序的运行效率(在排队的时候可以做别的事,过一会可以回来拿这个结果)
来源:https://blog.csdn.net/weixin_47906106/article/details/120112532
标签:python,生产者,消费者
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
[译]Javascript风格要素(二)
2008-02-29 12:51:00
用Css来制作一个漂亮的多选列表框
2008-05-29 12:45:00
Linux添加Python path方法及修改环境变量的三种方法
2021-03-26 12:22:45
基于python实现上传文件到OSS代码实例
2022-12-14 16:45:17
python list 查询是否存在并且并返回下标的操作
2023-06-20 12:05:43
![](https://img.aspxhome.com/file/2023/5/84105_0s.jpg)
基于python实现学生管理系统
2021-11-24 21:07:48
Python实现贪吃蛇小游戏(双人模式)
2021-06-07 11:15:02
4个的Python自动化脚本分享
2021-05-28 19:22:29
python单线程实现多个定时器示例
2023-05-11 08:59:18
兼容firefox的给每一个onClick再附加一个事件
2023-08-24 18:29:47
MySQL数据库单一表突破4G限制的实现方法
2008-11-02 14:43:00
解决python-redis-lock分布式锁的问题
2023-05-23 18:57:49
![](https://img.aspxhome.com/file/2023/3/98783_0s.png)
利用 Python 实现多任务进程
2023-12-19 02:53:52
![](https://img.aspxhome.com/file/2023/2/93882_0s.png)
Python SDK实现私服上传下载的示例
2021-11-22 08:14:42
简单了解python的break、continue、pass
2022-06-01 01:20:10
![](https://img.aspxhome.com/file/2023/5/76975_0s.png)
利用Python编写个冷笑话生成器
2021-05-10 15:13:20
![](https://img.aspxhome.com/file/2023/1/112521_0s.jpg)
Python + selenium + crontab实现每日定时自动打卡功能
2021-06-10 19:45:42
![](https://img.aspxhome.com/file/2023/6/84926_0s.png)
ThinkPHP CURD方法之limit方法详解
2023-11-15 03:58:00
Python中给List添加元素的4种方法分享
2023-09-12 04:33:58
OpenAI的Whisper模型进行语音识别使用详解
2022-02-24 23:50:51
![](https://img.aspxhome.com/file/2023/7/90637_0s.png)