队列&生产者消费者
Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用多线程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间信息传递.
如果在多线程中,给存放数据,也就是修改同一份数据, 所以就需要上锁 但是在列队这不用加
因为!!队列是线程安全的,存储数据的时候,程序就会给上锁, 能够保证数据的唯一性.
1.先入先出 fisrt in fisrt out ---> queue.Queue() FIFO队列
2.后入先出 last in fisrt out ----> queue.LifoQueue() LIFO队列
3.优先级队列 ----->queue.PriorityQueue()
import queue ###先进先出
q1=queue.Queue(maxsize=3) #这里设置是可以存放多少个队列 如果设置了3个 但是q.put达到3个以上 ,就会阻塞 因为这是队列 先进先出
q1.put(1)
q1.put(2)
q1.put(3) ###权重 优先级
q2=queue.PriorityQueue()
q2.put([6,'alex'])
q2.put([3,'zhaichaoqun'])
q2.put([10,'renchenghon']) ###后进先出
q3=queue.LifoQueue()
q3.put([6,'alex'])
q3.put([3,'zhaichaoqun'])
q3.put([10,'renchenghon']) print(q1.empty()) #判断是不是为空 不空为False
print(q1.full()) #判断是不是满
print(q1.qsize()) #队列大小 #因为是队列 不能跳着取。 必须一个一个取 遵循先进先出
print(q1.get()) #get是用来取第一个值 并在队列中取消这个
print(q1.get()) #get是用来取第二个值
print(q1.get()) #get是用来取第三个值
print('取完后队列',q1.qsize()) print(q2.get())
print(q2.get())
print(q2.get())
#这里get 如果没有值 就一直等待
print('---')
print(q3.get())
print(q3.get())
print(q3.get())
q1.empty() 判断是不是为空
q1.full() 判断队列是不是满了 #如果满了。在往队列中放数据就会卡住.
q1.qsize() 队列大小
生产者消费者
来段实例代码看看
import queue
import time
import threading def consumer(name): #这就是定义的消费者。。。。 因为去q.get 队列中的值
while True:
print('%s 取得蛋糕 %s并吃了它' %(name,q.get())) #q.get 就是去队列中取值
time.sleep(0.5)
q.task_done() #回执
def produce(name):
count=0
#while q.qsize() <5: #因为队列设置的大小为4 那么这里设置小于5,因为上面会取。队列就会取,所以这里会一直进行下去
for i in range(10):
print("%s生产了%s个蛋糕" %(name,count))
q.put(count)
count +=1
#time.sleep(2)
q.join() #直到队列被消费完毕
print('生产完了------')
q=queue.Queue(maxsize=4) #设置队列大小为4
#创建线程
p1=threading.Thread(target=consumer,args=('rch',))
p2=threading.Thread(target=produce,args=('zcq',))
p1.start()
p2.start()
consumer 定义的消费者
produce 定义的生产者
这里有个点要记下:
1.这里用到了q.task_done()
A。这里的作用是,每个消费者在消费完这个任务之后, 都要给你的生产者发送一个回执,生产者收集完所有的回执,就会判断所有的任务是不是都运行结束了,如果是,就可以结束了
B。这里用到了join ,跟前面是一样的, 这里就是等待所有子线程回执都回来, 才运行主线程.
这里可以一直增加生产者,或者消费者 。
生产者消费者的2个主要作用
1.程序的解耦合
2.提高了程序的运行效率
task_done()
意味着之前入队的一个任务已经完成。由队列的消费者线程调用。每一个get()调用得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕。
如果当前一个join()正在阻塞,它将在队列中的所有任务都处理完时恢复执行(即每一个由put()调用入队的任务都有一个对应的task_done()调用)。
join()
阻塞调用线程,直到队列中的所有任务被处理掉。
只要有数据被加入队列,未完成的任务数就会增加。当消费者线程调用task_done()(意味着有消费者取得任务并完成任务),未完成的任务数就会减少。当未完成的任务数降到0,join()解除阻塞。
put(item[, block[, timeout]])
将item放入队列中。
- 如果可选的参数block为True且timeout为空对象(默认的情况,阻塞调用,无超时)。
- 如果timeout是个正整数,阻塞调用进程最多timeout秒,如果一直无空空间可用,抛出Full异常(带超时的阻塞调用)。
- 如果block为False,如果有空闲空间可用将数据放入队列,否则立即抛出Full异常
其非阻塞版本为put_nowait等同于put(item, False)
get([block[, timeout]])
从队列中移除并返回一个数据。block跟timeout参数同put方法
其非阻塞方法为`get_nowait()`相当与get(False)
empty()
如果队列为空,返回True,反之返回False
队列&生产者消费者的更多相关文章
- #queue队列 #生产者消费者模型
#queue队列 #生产者消费者模型 #queue队列 #有顺序的容器 #程序解耦 #提高运行效率 #class queue.Queue(maxsize=0) #先入先出 #class queue.L ...
- Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue
进程同步: 1. 锁 (重点) 锁通常被用来实现对共享资源的同步访问.为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁, ...
- python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))
昨日内容回顾 python中启动子进程并发编程并发 :多段程序看起来是同时运行的ftp 网盘不支持并发socketserver 多进程 并发异步 两个进程 分别做不同的事情 创建新进程join :阻塞 ...
- 5 并发编程-(进程)-队列&生产者消费者模型
1.队列的介绍 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的 创建队列的类(底层就是以管道和锁定的方式实现 ...
- python2.0_s12_day9之day8遗留知识(queue队列&生产者消费者模型)
4.线程 1.语法 2.join 3.线程锁之Lock\Rlock\信号量 4.将线程变为守护进程 5.Event事件 * 6.queue队列 * 7.生产者消费者模型 4.6 queue队列 que ...
- python网络编程--进程(方法和通信),锁, 队列,生产者消费者模型
1.进程 正在进行的一个过程或者说一个任务.负责执行任务的是cpu 进程(Process: 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在 ...
- day 28 :进程相关,进程池,锁,队列,生产者消费者模式
---恢复内容开始--- 前情提要: 一:进程Process 1:模块介绍 from multiprocessing import Process from multiprocessing impo ...
- 10 阻塞队列 & 生产者-消费者模式
原文:http://www.cnblogs.com/dolphin0520/p/3932906.html 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue.LinkedList(Li ...
- 实战Spring4+ActiveMQ整合实现消息队列(生产者+消费者)
引言: 最近公司做了一个以信息安全为主的项目,其中有一个业务需求就是,项目定时监控操作用户的行为,对于一些违规操作严重的行为,以发送邮件(ForMail)的形式进行邮件告警,可能是多人,也可能是一个人 ...
随机推荐
- C#委托的一次"甜蜜"接触
委托是个说烂了的话题,但是依旧有好多人不知道为什么要在C#中使用委托,最近有朋友也问到我这个问题,所以举例些场景,以供那些知道怎么声明委托.怎么调用却不知道为什么要用的朋友一些参考,当然也是希望验证下 ...
- C# - Networkcomms
来自英国的用C#语言编写的开源的TCP/UDP网络通信框架,简单方便,性能稳定. 参考: NetworkComms官网: NetworkComms通信框架中文网: 介绍开源的.net通信框架: Ne ...
- [(ngModel)]的实现原理
讨论[(ngModel)]之前,先讲下属性绑定和事件绑定. 在属性绑定中,值从模型中流动到视图上的目标属性.[],通过把属性名放在方括号中来标记出目标属性.这是从模型到视图的单向数据绑定. 在 ...
- TYPESDK手游聚合SDK服务端设计思路与架构之四:流程优化之信息安全与订单校验
有了前文几个步骤的分析和设计,TYPESDK的信息交互流程已经可以正常工作了,但是,这个流程还没有考虑到支付这样的过程中,至关重要的信息安全问题. 在整个交互过程中,游戏服务端,SDK服务端,渠道服务 ...
- Eclipse 日期和时间格式自定义
点击下载Eclipse插件 org.eclipse.text_3.5.300.v20130515-1451.jar 覆盖下图所示的jar文件. /************************* ...
- Spring 4 + Quartz 2.2.1 Scheduler Integration Example
In this post we will see how to schedule Jobs using Quartz Scheduler with Spring. Spring provides co ...
- Xming + PuTTY 在Windows下远程Linux主机使用图形界面的程序
安装X Window yum groupinstall 'X Window System'
- emoji哈哈哈哈
Unicode 官网上的FAQ令人发笑,啊哈哈哈 Q: What are the most popular emoji characters? Q: Do emoji characters have ...
- C#使用ADO.NET访问数据库(一)
博主好久没更新博客了,最近有点忙(打麻将0.0..),今天更新一篇C#的,我还是想坚持更新博客,分享一下自己的心得,闲话少说,开始正题~~ ADO.NET概述:ADO.NET的作用在于他是客户端访问服 ...
- 获取iPhone手机的UDID和设备名称.
关于设备名称: iPhone的设备名称也可以在手机上面查看到:设置-通用-关于本机-名称(设备名称是可以自己改的) 关于UUID: 什么?用了iPhone这么久你不知道什么叫UDID! UDID 是由 ...