Python并发编程之多进程(生产者消费者模型)
十二.生产者消费者模型
1.什么是生产者消费者模型
- 生产者 : 程序中负责产生数据的一方
- 消费者 : 程序中负责处理数据的一方
2.为什么引入生产者消费者模型
在并发编程中, 生产者消费者模式通过一个容器来解决生产者和消费者之间的强耦合性, 两者之间不再是直接通信, 而是通过堵塞队列来进行通信, 生产者(生产速度快)不必再等待消费者是否处理完数据, 消费者直接从队列中取, 该队列就相当于一个缓冲区, 平衡了生产者和消费者的工作能力, 从而提高了程序整体的数据处理速度
3.如何实现
通过队列 : 生产者------>队列------->消费者
4.生产者消费者示例
from multiprocessing import Process, Queue
import time, randomdef producer(q, name, food):for i in range(3):res = f"{food}{i}"time.sleep(random.randint(1, 3)) # 模拟生产者数据产出时间q.put(res) # 将产生的数据放入到队列中print(f"\033[1;35m{name}:生产了:{res}\033[0m")def consumer(q, name):while True:res = q.get() # 取出数据if res == None: break # 判断是否None, None代表队列取完了,结束time.sleep(random.randint(1, 3)) # 模拟消费者处理数据时间print(f"\033[1;36m{name}吃了{res}\033[0m")if __name__ == "__main__":q = Queue() # 创建队列# 开启三个生产者进程p1 = Process(target=producer, args=(q, "shawn", "香肠")) p2 = Process(target=producer, args=(q, "派大星", "热狗"))p3 = Process(target=producer, args=(q, "海绵宝宝", "鸡"))# 开启两个消费者进程c1 = Process(target=consumer, args=(q, "章鱼哥"))c2 = Process(target=consumer, args=(q, "蟹老板"))p1.start()p2.start()p3.start()c1.start()c2.start()# 等待生产者全部生产完毕结束进程p1.join()p2.join()p3.join()# 主进程再想队列里面放入两个None,当消费者拿到后代表取完了q.put(None)q.put(None)print("痞老板:主")'''输出
shawn:生产了:香肠0
派大星:生产了:热狗0
章鱼哥吃了香肠0
蟹老板吃了热狗0
派大星:生产了:热狗1
shawn:生产了:香肠1
海绵宝宝:生产了:鸡0
章鱼哥吃了热狗1
海绵宝宝:生产了:鸡1
派大星:生产了:热狗2
章鱼哥吃了鸡0
蟹老板吃了香肠1
shawn:生产了:香肠2
海绵宝宝:生产了:鸡2
痞老板:主
蟹老板吃了热狗2
章鱼哥吃了鸡1
蟹老板吃了香肠2
章鱼哥吃了鸡2
Process finished with exit code 0
'''
5.第二种生产者消费者模型使用JoinableQueue类 (了解)
- JoinableQueue类的实例
q = JoinableQueue([maxsize])
: 与 Queue 的对象一样, 但队列允许项目的使用者通知生成者项目已经被成功处理。通知进程是使用共享的信号和条件变量来实现的
- 方法
方法 | 作用 |
---|---|
q.task_done( ) | 使用者使用此方法发出信号,表示q.get( )的返回项目已经被处理。如果调用此方法的次数大于从队列中删除项目的数量,将引发ValueError异常 |
q.join( ) | 生产者调用此方法进行阻塞,直到队列中所有的项目均被处理。阻塞将持续到队列中的每个项目均调用q.task_done()方法为止 |
from multiprocessing import Process, JoinableQueue
import time, randomdef producer(q, name, food):for i in range(3):res = f"{food}{i}"q.put(res)time.sleep(random.randint(1, 3))print(f"\033[1;35m{name}:生产了:{res}\033[0m")q.join() # 等待每个生产者自己放入的数据被消费者取完才结束该进程def consumer(q, name):while True:res = q.get()if res == None: breaktime.sleep(random.randint(1, 3))print(f"\033[1;36m{name}吃了{res}\033[0m")q.task_done() # 消费者每次取走一个数据都发送一个task_done信号,生产者那边的计数相应减1if __name__ == "__main__":q = JoinableQueue() # 创建一个对象# 创建三个生产者p1 = Process(target=producer, args=(q, "shawn", "香肠"))p2 = Process(target=producer, args=(q, "派大星", "热狗"))p3 = Process(target=producer, args=(q, "海绵宝宝", "鸡"))# 创建两个消费者c1 = Process(target=consumer, args=(q, "章鱼哥"))c2 = Process(target=consumer, args=(q, "蟹老板"))# 将两个消费者设置成守护进程, 主进程代码结束,这两个消费者进程相应结束c1.daemon = Truec2.daemon = Truep1.start()p2.start()p3.start()c1.start()c2.start()# 等待三个生产者进程结束p1.join()p2.join()p3.join()
Python并发编程之多进程(生产者消费者模型)相关推荐
- Python并发编程之多进程(二)
十.进程同步 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理 ---------- ...
- Linux 多线程编程(实现生产者消费者模型)
Linux 多线程编程 线程分类 线程按照其调度者可以分为用户级线程和内核级线程两种. 内核级线程 在一个系统上实现线程模型的方式有好几种,因内核和用户空间提供的支持而有一定程度的级别差异.最简单的模 ...
- python并发编程之多进程、多线程、异步和协程
转载 自 tyomcat: https://www.cnblogs.com/tyomcat/p/5486827.html 一.多线程 多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活 ...
- python并发编程之多进程理论部分
阅读目录 一 什么是进程 二 进程与程序的区别 三 并发与并行 四 同步\异步and阻塞\非阻塞(重点) 五 进程的创建(了解) 六 进程的终止(了解) 七 进程的层次结构 八 进程的状态 九 进程并 ...
- Python并发编程之多进程(一)
一.什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 进程是资源分配的基本单位 进程有:代码段,数据段,进程控制块(PCB)组成 二.进程与程序的区别 程序仅仅只是一堆代 ...
- python并发编程之多进程理论知识
一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的任务,写书的任 ...
- Python并发编程:多进程-守护进程
一 守护进程 主进程创建子进程,然后将该进程设置成守护自己的进程,守护进程就好比皇帝身边的老太监,皇帝已死老太监就跟着殉葬了. 关于守护进程需要强调两点: 其一:守护进程会在主进程代码执行结束后就终止 ...
- 并发编程之多进程编程(python版)
目录 1 python多进程编程概述 2 需求和方案 背景: 需求: 解决思路: 需要解决的问题和方案: 3 完整代码 1 python多进程编程概述 python中的多线程无法利用多核优势,如果想要 ...
- Python并发编程系列之多进程(multiprocessing)
1 引言 本篇博文主要对Python中并发编程中的多进程相关内容展开详细介绍,Python进程主要在multiprocessing模块中,本博文以multiprocessing种Process类为中心 ...
最新文章
- Python使用matplotlib绘制数据去重前后的柱状图对比图(在同一个图中显示去重操作之后同一数据集的变化情况)
- 通过醉品商城改版反思网站改版的那些事
- IOS网络篇1之截取本地URL请求(NSURLProtocol)
- python编写自定义模块_编写和导入自定义模块/类
- 能够显著降低焦虑的两种方法
- Oracle——17概要文件
- centos7 配置虚拟交换机(物理交换机truckport设置)(使用brctl)
- java进阶案例下载_java进阶案例
- Java案例:利用JDBC连接Oracle数据库
- 【python】类的封装、多态
- leetcode691:Stickers to Spell Word
- 36岁青椒的“我”想对26岁读博的“你”说些话
- mysql 查找入职时间最早_(2)查找入职员工时间排名倒数第三的员工所有信息...
- 原生小程序用画布制作海报,等比例缩放,和uniapp差不多就是写法有点不同
- python基础语法大全
- TI GEL文件作用
- [HTML+Bootstrap+CSS+jQuery] 时差计算器(计算时差、验证格式、当前时间、历史记录……)
- Unity进度条制作
- 游戏软件寄售官网源码带后台
- 抖音seo源码 短视频seo源码二次开发,怎么使用抖音seo源码,视频seo源码私有化部署?
热门文章