Python-生产者消费模型 线程
7、生产者消费者模型(*****)(思聪吃热狗代码)
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。
该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度 为什么要使用生产者和消费者模式
在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。
在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,
那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,
如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。
为了解决这个问题于是引入了生产者和消费者模式。 1、什么是生产者消费者模型?
模型 设计模式 三层结构 等等表示的都是一种编程思路
模型指的是解决问题的一种思路 实现生产者消费者模型三要素
1、生产者:生产数据的任务
2、消费者:处理数据的任务
3、队列Queue:一个共享的数据容器
如何实现:
生产者<-->队列<——>消费者
(比如: 文件夹里有十个文本文档 要求你找出文件中包含习大大关键字的文件
打开并读取文件数据就是生产者
查找关键字的过程就是消费者) 2、什么时候用生产者消费者模型?
在程序中有明显地两类任务,一类负责生产数据,另外一个类则拿到生产的数据进行处理,此时就应该
考虑使用生产者消费者模型来处理这种问题 3、为什么要用生产者消费者模型?好处,能解决的问题是?
1、平衡生产者与消费者之间的工作能力,从而提高程序整体处理数据的速度
2、将生产者与消费者 解耦和
原理:
解耦和指的是生产者不与消费者直接打交道,
生产者可以不停地往队里里放数据
消费者可以不停地从队列里取走数据进行处理 生产者消费者模型案例:制作热狗
# 方法一:
from multiprocessing import Process,Queue
def make_hotdog(queue,name):
queue.put(data)
def eat_hotdog(queue,name):
data = queue.get()
if __name__ == '__main__':#创建队列
q = Queue()
p1 = Process(target=make_hotdog,args=(q,"邵钻钻的热狗店"))
c1 = Process(target=eat_hotdog, args=(q,"思聪"))
p1.start()
c1.start()
p1.join() # 让主进程等三家店全都做完后....
q.put(None) #发送结束信号,有几个消费者,就放几行None
# 方法二:
from multiprocessing import Process,JoinableQueue
def make_hotdog(queue,name):
queue.put(data)
q.join()
def eat_hotdog(queue,name):
data = queue.get()
queue.task_done()
if __name__ == '__main__':#创建队列
q = JoinableQueue()
p1 = Process(target=make_hotdog,args=(q,"邵钻钻的热狗店"))
c1 = Process(target=eat_hotdog, args=(q,"思聪"))
p1.start()
c1.daemon = True# 将消费者作为主进程的守护进程
c1.start()
p1.join() # 让主进程等三家店全都做完后.... 线程 (生产者消费者代码 抢票代码)
1、线程理论(*****)
1 线程指的是一条流水线的工作过程 线程是CPU的基本执行单位,一个进程必须有至少一个线程
线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程
车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一个流水线
流水线的工作需要电源,电源就相当于cpu
所以,进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),
而线程才是cpu上的执行单位。 为什么用?
需要实现并发执行任务 2、线程vs进程
1.资源开销 进程开销大 线程开销小(在多线程中CPU的切换速度会非常快 但资源消耗没有进程高)
如果我们的软件是一个工厂,该工厂有多条流水线,流水线工作需要电源,电源只有一个即cpu(单核cpu)
一个车间就是一个进程,一个车间至少一条流水线(一个进程至少一个线程)
创建一个进程,就是创建一个车间(申请空间,在该空间内建至少一条流水线)
而建线程,就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小
2.数据共享 一个进程内的所有线程数据共享,不同进程内资源隔离 2、开启线程的两种方式(*****)
1.实例化Thread类 参数target中传入任务函数
2.继承Thread类 实现run函数
from threading import Thread
3、守护进程vs守护线程(**)
大前提:一个任务守护另外一个任务代码的执行过程
在一个进程内只有一个线程的情况下,守护进程会在主进程代码执行完毕后立刻结束
在一个进程可以开启多个线程,守护的线程会在该进程内所有非守护线程都执行完毕后才结束 主进程代码运行完毕,守护进程就会结束 a 守护 b 同时还有另一个线程 c
a 会等到 b 和 c都结束才结束
皇后 守护皇帝
皇宫里还有太子
皇后会等到皇帝和太子都死了 才死
守护线程会等待所有非守护线程结束后才算结束
main
sub1
sub2
sub3 sub1.deamon = True
sub1会等待 main sub2 sub3 全都结束 才会结束
Python-生产者消费模型 线程的更多相关文章
- go 语言之 生产者消费模型
简易的生产者消费模型,通过管道[也可以理解为队列],管道是先进先出,主要是理解chan 生产者使用make将chan初始化,并且设置chan长度,如果不设置,生产者就写入不了通道 go 是使用线程开始 ...
- 队列 Queue 与 生产者消费模型
队列:先进先出 # from multiprocessing import Queue # Q = Queue(4) # Q.put('a') # Q.put('b') # Q.put('b') # ...
- python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02
目录 进程补充 进程通信前言 Queue队列的基本使用 通过Queue队列实现进程间通信(IPC机制) 生产者消费者模型 以做包子买包子为例实现当包子卖完了停止消费行为 线程 什么是线程 为什么要有线 ...
- python生产者消费者模型
业界用的比较广泛,多线程之间进行同步数据的方法,解决线程之间堵塞,互相不影响. server --> 生产者 client --> 消费者 在一个程序中实现又有生产者又有消费者 ,生产者不 ...
- 8.12 day31 进程间通信 Queue队列使用 生产者消费者模型 线程理论 创建及对象属性方法 线程互斥锁 守护线程
进程补充 进程通信 要想实现进程间通信,可以用管道或者队列 队列比管道更好用(队列自带管道和锁) 管道和队列的共同特点:数据只有一份,取完就没了 无法重复获取用一份数据 队列特点:先进先出 堆栈特点: ...
- python生产者消费者模型优点
生产者消费者模型:解耦,通过队列降低耦合,支持并发,生产者和消费者是两个独立的并发体,他们之间使用缓存区作为桥梁连接,生产者指望里丢数据,就可以生产下一个数据了,消费者从中拿数据,这样就不会阻塞,影响 ...
- 用生产者消费模型爬取智联招聘python岗位信息
爬取python岗位智联招聘 这里爬取北京地区岗位招聘python岗位,并存入EXECEL文件内,代码如下: import json import xlwt import requests from ...
- 操作系统OS,Python - 生产者消费者模型
1. 缓冲区(此处用阻塞队列充当),解决消费者和生产者强耦合问题.(生产者和消费者不直接通信) 2. 通过平衡生产者线程和消费者线程,来提高程序整体处理数据速度. 3. 在并发编程中该模式能解决大多数 ...
- 生产者-消费者模型-线程安全队列Queue
#python3 #product new data into the queue #comsume data from the queue from queue import Queue impor ...
随机推荐
- Android: View换切后,无法正常设置焦点或切换后TextView的虚拟键盘不弹出
边学.边测试,花了三天时间完工一个小应用. 遇到很多问题,但最终还是解决了. 我的手机是Android2.2版,所以我也在是2.2版环境下学习,开发. 1. 在同一个Activity中的不同View( ...
- csp20160904解题报告
dijkstra+贪心 每次加一个到起始点(首都)距离最小的点. 然后加边,这个最小点必然通过一条边和已加入的某个点相连,在这个最小点与已加入的点相连的边中,选取最短的一条边加入. 证明如下: 前提: ...
- springboot与springcloud的版本问题
Spring Cloud为开发者提供了一套可以用来快速搭建分布式系统中常见模式的工具.提取主干即是Spring Cloud提供了一套工具.这些工具为开发人员提供了分布式系统下常见问题的通用解决方案.这 ...
- 高级Linux运维工程师必备技能(扫盲篇)
高级Linux运维工程师必备技能(扫盲篇) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在了解文件系统之前,我们要学习一下磁盘存储数据的方式,大家都知道文件从内存若要持久化存储的 ...
- python---ORM之SQLAlchemy(1)
定义一个类,ORM(对象关系映射)将这个类转换为sql语句,使用pymysql进行执行 一,底层处理 使用engine/connectionpooling/dialect进行数据库操作,engine使 ...
- java实现Md5加密工具类
场景:平常我们用户注册的密码保存到数据库都不会是明文存储的.都是经过加密之后的.因为保证用户的安全性.我们通常是用md5算法来加密的. 这个只能算是一个工具类.没必要了解里面是怎么实现的.拿来用就可以 ...
- rabbitmq用户授权
创建用户 rabbitmqctl add_user kye01 123456 设置用户角色 rabbitmqctl set_user_tags kye01 monitoring 查看用户清单 rabb ...
- weblogic/tomcat Get乱码【转】
引用自:http://www.cnblogs.com/1995hxt/p/4982835.html (非常清晰) 其它好文 tomcat和weblogic设置编码方式 tomcat解决方案 在con ...
- WinForm ListView虚拟模式加载数据 提高加载速度
将VirtualMode 属性设置为 true 会将 ListView 置于虚拟模式.控件不再使用Collection.Add()这种方式来添加数据,取而代之的是使用RetrieveVirtualIt ...
- python 创建实例--待完善
今天好好琢磨一下 python 创建实例的先后顺序 一. 就定义一个普通类 Util (默认)继承自 object,覆写 new ,init 方法 class Util(object): def __ ...