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 ...
随机推荐
- Spring实现文件的上传下载
背景:之前一直做的是数据库的增删改查工作,对于文件的上传下载比较排斥,今天研究了下具体的实现,发现其实是很简单.此处不仅要实现单文件的上传,还要实现多文件的上传. 单文件的下载知道了,多文件的下载呢? ...
- npm install 报错Unexpected end of JSON input while parsing near...
安装node http://nodejs.cn/download/ 克隆代码 ....... 执行安装 npm install 然后就报了一坨错误 清理一下缓存 sudo npm cache veri ...
- pthread_cleanup_push()/pthread_cleanup_pop()的详解
一般来说,Posix的线程终止有两种情况:正常终止和非正常终止.线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式:非正常终止是线程在其他线程 ...
- Linux就该这么学--第五期 学习笔记
第一节:基础 <Linux就该这么学>第二期视频 Linux就该这么学第5期第二节: ------------你的价值:你对公司做出的共享和你的不可替代性------------瑞尔系统R ...
- Hadoop生态圈-使用Ganglia监控flume中间件
Hadoop生态圈-使用Ganglia监控flume中间件 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Ganglia监控简介 加州伯克利大学千禧计划的其中一个开源项目.是一 ...
- 学习windows编程 day3 之窗口绘画一:点线绘制
#include <windows.h> #include <math.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT message, ...
- 996ICU与程序猿的个人成长
目录 规划 学习 专业领域知识 知识广度 第二职业 理财 借势 添砖加瓦 最近一段时间,996ICU在互联网界引发"大地震",从普通员工.行业大佬甚至官媒都进行了发声,大家对这个问 ...
- Eclipse中将web项目自动发布到Tomcat webapps下(转)
A:FileàDynamic Web Project[工程名:test] B:右键WebContent,New-->Jsp File C:右键test,Run AsàRun on Serverà ...
- asp.net mvc4 在EF新增的时候报对一个实体或多个实体验证失败
//entity为空 是数据库上下文会验证实体验证 var entity = db.UserInfo.Where(u => u.Mobile == mobile).FirstOrDefault( ...
- Winfrom多文档界面实现
Winfrom多文档界面实现 闲来无事,研究了下比较常用的多文档界面风格,网上找了好多例子,最终实现.记录一下 废话不多说,先上个效果: 默认打开我的桌面,首页不允许关闭,xtraTabPage动态添 ...