登 录
注 册
< 编程语言
Python
Java
Go
SQL
数据结构与算法
极速安装
线程同步与信号量
生产者消费者
Python调用Java
Python自动发送邮件
数据导出工具
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
Python
>>
生产者消费者
生产者消费者
2020-07-02 23:46:16 星期四 阅读:1394
![](/static/images/article_images/1693753781.196543.jpeg) 在线程世界里,生产者就是生产数据(或者说发布任务)的线程,消费者就是消费数据(或者说处理任务)的线程。 在任务执行过程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。 同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者提供更多的任务,本质上,这是一种供需不平衡的表现。为了解决这个问题,我们创造了生产者和消费者模式。 我们使用 Queue 模块(在 Python 3.x 版本中重命名为queue)来提供线程间通信的机制,从而让线程之间可以互相分享数据。具体而言,就是创建一个队列,让生 产者(线程)在其中放入新的商品,而消费者(线程)消费这些商品。 ```python # -*- coding: utf-8 -*- import random import time from queue import Queue import threading def add_clothes(queue): print("正在往队列里生产内衣...") queue.put("xxx", 1) print("当前队列大小{}".format(queue.qsize())) def buy_clothes(queue): val = queue.get(1) print("消费者正在从队列里买内衣...") print("当前队列大小{}".format(queue.qsize())) # 生产者不断的生产内衣 # 生产者目的只有一个,向队列中放入一个对象(生产一件内衣) # 然后再休息片刻,知道达到每次脚本执行时随机生成的次数为止。 # 生产者的睡眠时间要比消费者要短,这是为了防止消费者从空的队列里拿内衣 # 通过给生产者一个更短的等候时间,使得轮到消费者线程时,已存在可消费的对象 def producer(queue, loops): for i in range(loops): add_clothes(queue) time.sleep(random.randint(1, 5) / 8) def consumer(queue, loops): for i in range(loops): buy_clothes(queue) time.sleep(random.randint(1, 5) / 2) def main(): # 随机获取一个2-5之间的数,用来指定生产次数或者消费次数 nloops = random.randint(2, 5) # 创建一个先入先出队列。给定最大值32,在队列没有空间时阻塞;(最多只能生产32件内衣) # 如果不指定具体的值,则为无限队列(可以生产无限件内衣) q = Queue(32) t1 = threading.Thread(target=producer, args=(q, nloops)) t2 = threading.Thread(target=consumer, args=(q, nloops)) t1.start() t2.start() t1.join() t2.join() print("ALL Done") if __name__ == "__main__": main() ``` 生产这和消费者并不需要轮流执行,因为设置了随机休眠的时间。 从这个例子可以看出,`对一个要执行多个任务的程序,可以让每个任务使用单独的线程`,相比于使用单线程程序完成所有任务,这种程序设计方式更加整洁。