python生产和消费模型_python queue和生产者和消费者模型
queue队列
当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用。
classqueue.Queue(maxsize=0) #先入先出classqueue.LifoQueue(maxsize=0) #last in fisrt outclassqueue.PriorityQueue(maxsize=0) #存储数据时可设置优先级的队列
没有数据会一直等。服务器端就会卡住。
有数据就取没有数据就抛出异常。
block=true 阻塞 取不到数据就会阻塞IO
timeout =1 阻塞时间1S 等待一秒 没有新消息就抛出错误
maxsize= 3 队列只能放3个元素 超过了以后会卡住。
LifoQueue() 后入先出
q = queue.LifoQueue()
q.put(1)
q.put(3)
q.put(4)
print(q.get()) #4
print(q.get()) #3
print(q.get()) #1
PriorityQueue() 有优先级的队列
import queue
q = queue.PriorityQueue()
q.put((-1,'jim'))
q.put((20,'lilei'))
q.put((3,'lily'))
q.put((2,'lucy'))
print(q.get())
print(q.get())
print(q.get())
print(q.get())
#############
(-1, 'jim')
(2, 'lucy')
(3, 'lily')
(20, 'lilei')
生产者和消费者模型
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
为什么要使用生产者和消费者模式
在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。
什么是生产者消费者模式
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
import queue
import threading,time
q = queue.Queue(maxsize=10)
def Producer(name):
count =1
while True:
q.put("包子 %s" % count)
print("做了包子",count)
count +=1
time.sleep(0.5)
def Consumer(name):
while True :
print("[%s] 取到[%s] 并且吃了它..." %(name,q.get()))
time.sleep(1)
p = threading.Thread(target=Producer,args=("Lily",))
c = threading.Thread(target=Consumer,args=("Lilei",))
c1 = threading.Thread(target=Consumer,args=("Ahi",))
p.start()
c.start()
c1.start()
运行结果
做了包子 1
[Lilei] 取到[包子 1] 并且吃了它...
做了包子 2
[Ahi] 取到[包子 2] 并且吃了它...
[Lilei] 取到[包子 3] 并且吃了它...
做了包子 3
做了包子 4
[Ahi] 取到[包子 4] 并且吃了它...
做了包子 5
[Lilei] 取到[包子 5] 并且吃了它...
做了包子 6
[Ahi] 取到[包子 6] 并且吃了它...
做了包子 7
[Lilei] 取到[包子 7] 并且吃了它...
做了包子 8
[Ahi] 取到[包子 8] 并且吃了它...
做了包子 9
[Lilei] 取到[包子 9] 并且吃了它...
做了包子 10
[Ahi] 取到[包子 10] 并且吃了它...
python生产和消费模型_python queue和生产者和消费者模型相关推荐
- Linux系统编程---17(条件变量及其函数,生产者消费者条件变量模型,生产者与消费者模型(线程安全队列),条件变量优点,信号量及其主要函数,信号量与条件变量的区别,)
条件变量 条件变量本身不是锁!但它也可以造成线程阻塞.通常与互斥锁配合使用.给多线程提供一个会合的场所. 主要应用函数: pthread_cond_init 函数 pthread_cond_destr ...
- C++实现生产者和消费者模型
C++实现生产者和消费者模型 C++实现生产者和消费者模型 1.实现细节 2.单生产者-单消费者模型 3.单生产者-多消费者模型 4.多生产者-单消费者模型 5.多生产者-多消费者模型 参考 C++实 ...
- 【Linux下】 线程同步 生产者与消费者模型
文章目录 [Linux下] 线程同步 生产者与消费者模型 线程同步 同步概念与竞态条件 条件变量 条件变量本质 操作条件变量 初始化和销毁条件变量 等待 唤醒 通过条件变量实现的简单线程同步例子 为什 ...
- python 进程间同步_python之路29 -- 多进程与进程同步(进程锁、信号量、事件)与进程间的通讯(队列和管道、生产者与消费者模型)与进程池...
所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了.至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠 ...
- 0818Python总结-lock,Semaphore,event,Queue,生产者和消费者模型,JoinableQueue
一.锁 Lock from multiprocessing import Process,Lock 1.Lock基本用法 上锁和解锁是一对,只上锁不解锁会发生死锁现象(代码阻塞,不往下执行了) 互斥锁 ...
- Linux系统编程:使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型
代码实现 如题,使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型.本来是想只用信号量实现生产者消费者模型的,但是发现 只能在一个生产者和一个消费者之间,要在多个生产者和消费者模 ...
- Linux 生产者与消费者模型C++实现
生产者与消费者模型 本篇博客代码实现都是在linux环境下跑的 通过条件变量实现 应用场景:针对大量数据的产生与处理的场景 生产与处理是放到不同执行流中完成的,中间会增加一个数据缓冲区,作为中间的数据 ...
- 开启子进程的两种方式,孤儿进程与僵尸进程,守护进程,互斥锁,IPC机制,生产者与消费者模型...
开启子进程的两种方式 # # # 方式一: # from multiprocessing import Process # import time # # def task(x): # print(' ...
- 【Linux】生产者与消费者模型、信号量、死锁
目录 死锁 死锁的产生场景 死锁的gdb分析 1.通过调试可执行程序来分析 2.通过调试正在运行的程序 死锁的必要条件 死锁的预防 生产者与消费者模型 123规则 应用场景及特点 代码实现: 信号量 ...
最新文章
- FreeDos 历史
- Spring boot 启动后执行特定的操作
- maven依赖decoder_引入依赖maven打包报错
- SAP收购sysbase
- 前端vue显示柱状图_Vue接入Echarts 显示柱状图饼图
- MATLAB 长度和像素_MATLAB——单车道NaSch模型
- 10到十分精彩的智力题,你能过关几道?
- vpc源站保护_污染源自动监控设施运营要求
- Etcd集群的介绍和选主应用
- 168输出为861java_AcWing 861. 二分图的最大匹配-java-关键处注释
- Windows10共享文件夹、打印机,可是网络上显示“未授予用户在此计算机上的请求登录类型”的解决方案
- freemarker开发指南
- 飞机游戏跟踪导弹的算法[C#源码]
- HTML 实现扫雷游戏
- CCS以及DSP入门帖
- QT5-STK二次开发实例
- 【Get深一度】信号处理(三)——3db带宽
- mysql开发技巧笔记
- 基于汽车后市场应用 汽车VIN码识别 车架号识别数据SDK
- [从头读历史] 第276节 诗经 陈风
热门文章
- Evaluation of hybrid and non-hybrid methods for de novo assembly of nanopore reads
- 短序列拼接软件velvet简介
- java将输出结果写入csv文件_如何在Java中将数据写入.csv文件?
- JAVA基础13-Java抽象方法、抽象类、抽象之模板方法模式
- c语言easy,C语言easy….doc
- 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...
- 二十九、基本分页存储管理的基本概念
- AI A_star算法野人渡河-实验报告
- ASP .NET Core Web Razor Pages系列教程四:使用数据库进行交互 entity-framework(MySQL/MariaDB 版)
- nullptr和NULL