队列&生产者消费者
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)的形式进行邮件告警,可能是多人,也可能是一个人 ...
随机推荐
- expect基本使用方法
参考: http://www.cnblogs.com/lzrabbit/p/4298794.html expect是linux系统中可以和子进程进行交互的一个命令,使用它可以做一些自动化工作.pyth ...
- Java全角、半角字符的关系以及转换
如果搞明白了Java中全角字符和半角字符之间的关系,那他们之间的转换就不是个麻烦事儿.你只需要对这个关系有那么一个印象就足够了. 全角字符与半角字符的关系 通过下面的代码能看到Java中所有字符以及对 ...
- C#、JAVA操作Hadoop(HDFS、Map/Reduce)真实过程概述。组件、源码下载。无法解决:Response status code does not indicate success: 500。
一.Hadoop环境配置概述 三台虚拟机,操作系统为:Ubuntu 16.04. Hadoop版本:2.7.2 NameNode:192.168.72.132 DataNode:192.168.72. ...
- Mybatis的基本操作案列增加以及源码的分析(二)
一.构建一个框架的项目的思路 首先我们先建立一个web项目,我们需要jar,mybatis-config.xml和studentDao.xml的配置随后就是dao.daoimpl.entity.的架构 ...
- safari cookie设置中文失败
最近用H5进行手机端开发,由于是window操作系统,为了方便开发和调试,直接在chrome浏览器上进行测试,然后在android机上进行手机端测试,当功能基本完工后,原来在android上运行正常的 ...
- Position属性四个值:static、fixed、relative、absolute的区别和用法
1.static(静态定位):默认值.没有定位,元素出现在正常的文档流中(如果设置 top, bottom, left, right, z-index这些属性就不起做作了). 2.relative(相 ...
- C# Session添加、删除封装类
/// <summary> /// <para> </para> /// 常用工具类——Session操作类 /// <para> ---------- ...
- 什么是IIFE
立即执行函数表达式(Immediately-invoked function expression) IIFE 我们知道,在javascript(ES5)中,是没有块级作用域的概念的.看一个例子 fo ...
- 如果你的SharePoint出现了,状态服务问题,InfoPath无法正常使用
Create a new ‘State Service’ Service Application using Powershell February 14, 2012Leave a commentGo ...
- VS2012 Unit Test——Microsoft Fakes入门
如题,本文主要作为在VS2012使用Fakes的入门示例,开发工具必须是VS2012或更高版本. 关于Fakes的MSDN地址:http://msdn.microsoft.com/en-us/libr ...