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放入队列中。

  1. 如果可选的参数block为True且timeout为空对象(默认的情况,阻塞调用,无超时)。
  2. 如果timeout是个正整数,阻塞调用进程最多timeout秒,如果一直无空空间可用,抛出Full异常(带超时的阻塞调用)。
  3. 如果block为False,如果有空闲空间可用将数据放入队列,否则立即抛出Full异常

其非阻塞版本为put_nowait等同于put(item, False)

get([block[, timeout]])

从队列中移除并返回一个数据。block跟timeout参数同put方法

其非阻塞方法为`get_nowait()`相当与get(False)

empty()

如果队列为空,返回True,反之返回False

队列&生产者消费者的更多相关文章

  1. #queue队列 #生产者消费者模型

    #queue队列 #生产者消费者模型 #queue队列 #有顺序的容器 #程序解耦 #提高运行效率 #class queue.Queue(maxsize=0) #先入先出 #class queue.L ...

  2. Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue

    进程同步: 1. 锁 (重点)    锁通常被用来实现对共享资源的同步访问.为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁, ...

  3. python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))

    昨日内容回顾 python中启动子进程并发编程并发 :多段程序看起来是同时运行的ftp 网盘不支持并发socketserver 多进程 并发异步 两个进程 分别做不同的事情 创建新进程join :阻塞 ...

  4. 5 并发编程-(进程)-队列&生产者消费者模型

    1.队列的介绍 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的 创建队列的类(底层就是以管道和锁定的方式实现 ...

  5. python2.0_s12_day9之day8遗留知识(queue队列&生产者消费者模型)

    4.线程 1.语法 2.join 3.线程锁之Lock\Rlock\信号量 4.将线程变为守护进程 5.Event事件 * 6.queue队列 * 7.生产者消费者模型 4.6 queue队列 que ...

  6. python网络编程--进程(方法和通信),锁, 队列,生产者消费者模型

    1.进程 正在进行的一个过程或者说一个任务.负责执行任务的是cpu 进程(Process: 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在 ...

  7. day 28 :进程相关,进程池,锁,队列,生产者消费者模式

    ---恢复内容开始--- 前情提要: 一:进程Process  1:模块介绍 from multiprocessing import Process from multiprocessing impo ...

  8. 10 阻塞队列 & 生产者-消费者模式

    原文:http://www.cnblogs.com/dolphin0520/p/3932906.html 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue.LinkedList(Li ...

  9. 实战Spring4+ActiveMQ整合实现消息队列(生产者+消费者)

    引言: 最近公司做了一个以信息安全为主的项目,其中有一个业务需求就是,项目定时监控操作用户的行为,对于一些违规操作严重的行为,以发送邮件(ForMail)的形式进行邮件告警,可能是多人,也可能是一个人 ...

随机推荐

  1. 基于STM32Cube的IIC主从通信

    1.建立STM32Cube工程,我使用的芯片是STM32F429,为了更简单的建立单独的IIC通信任务,我使用了FREERTOS,另外选择了RCC(系统时钟初始化),I2C1,I2C2(为了验证代码的 ...

  2. ToolsCodeTemplate使用

    最近学习使用CodeSmith代码生成器 CodeSmith 是一种语法类似于asp.net的基于模板的代码生成器,程序可以自定义模板,从而减少重复编码的劳动量,提高效率. 作用:CodeSmith ...

  3. HibernateUtil.java

    package com.hkwy.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org ...

  4. JDBC_part1_Oracle数据库连接JDBC以及查询语句

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! JDBC part1 JDBC概述 jdbc是一种用于 ...

  5. Jquery元素选取、常用方法

    一:常用的选择器:(李昌辉) 基本选择器 $("#myDiv") //匹配唯一的具有此id值的元素 $("div") //匹配指定名称的所有元素 $(" ...

  6. JavaScript 函数表达式

    JavaScript中创建函数主要有两种方法:函数声明和函数表达式.这两种方式都有不同的适用场景.这篇笔记主要关注的是函数表达式的几大特点以及它的使用场景,下面一一描述. 主要特点 可选的函数名称 函 ...

  7. Fragment的生命周期

    Fragment的生命周期: 1. onAttach():Fragment对象跟Activity关联时 2. onCreate():Fragment对象的初始创建时 3. onCreateView() ...

  8. Android 手机卫士--导航界面1的布局编写

    本文地址:http://www.cnblogs.com/wuyudong/p/5943005.html,转载请注明出处. 本文实现导航界面1的布局的实现,效果如下图所示: 首先分析所使用的布局样式: ...

  9. 旅游公司招聘Java工程师

    公司招聘:岗位要求如下 Java开发工程师工作内容1.根据需求完成软件系统代码的开发,测试以及文档撰写工作:2.分析并解决客户的问题:3.配合业务部门进行数据分析以及系统优化 岗位要求:1.本科以上学 ...

  10. backup log is terminating abnormally because for write on file failed: 112(error not found)

    昨天遇到一个案例,YourSQLDba做事务日志备份时失败,检查YourSQLDba输出的错误信息如下: <Exec> <ctx>yMaint.backups</ctx& ...