队列(queue),实现程序间的松耦合

队列的三种类:

  • class queue.Queue(maxsize)# 先进先出, maxsize 指定队列长度,线程安全的清况下,可以放入实例,对实例进行传输
  • class queue.LifoQueue(maxsize) # 后进先出(栈)
  • class queue.PriorityQueue(maxsize) # 存储数据是可设置优先级的队列

每个类都有相似的方法:

q.qsize() 返回队列的个数
q.empty() 判断队列是否为空
q.full() 判断队列是否填满了
q.put(item,block = True, timeout = None) 把数据放入一个队列,队列满的时候阻塞了,用timeout限定时间,超过时间报异常,否则队列一直等着.
q.get() 拿出队列内的元素,
q.put_nowait() 如果队列满了直接不等待,抛异常
q.get_nowait() 如果队列里没有东西,直接抛异常
q.task_done() 在生产者-消费者模型中队列作为一个传送带,次方法如一个信号
import queue

q = queue.Queue()

q.put([32,None,'hello'])
q.put([45,34,77])
print(q.qsize())
print(q.empty())
print(q.full())
print('\n')
print(q.get()) # 队列按照先进先出
for i in q.get():
print(i)

例:example

2
False
False [32, None, 'hello']
45
34
77

result

其中:

  1. exception queue.Empty    #get()阻塞 ,get_nowait()非阻塞抛此异常
  2. exception queue.Full   #put()等待, put_nowait()   给queue设置长度时,队列满则抛此异常

注:在PriorityQueue()中,put的时候有两个参数((优先级,数值),timeout=None)(优先级1>10)

import queue
q = queue.PriorityQueue(maxsize=3) q.put((1,19))
q.put((10,[34, ]),timeout=2)
q.put((4,[32,None,'hello']))
print(q.qsize())
print(q.full())
print(q.get()) # 队列按照先进先出
print(q.get()) # 队列按照先进先出
print(q.get()) # 队列按照先进先出

例:PriorityQueue

3
True
(1, 19)
(4, [32, None, 'hello'])
(10, [34])

result

多线程基于Queue的生产者--消费者模型:

import queue,threading
import time
def consumer(n):
while True:
print('消费者[%s]号吃掉了包子:【%s】'%(n,q.get()))
time.sleep(1)
q.task_done() # **通知队列吃完一个,全都吃完啦,然后才通知生产者 def producer(n):
count = 1
while True:
time.sleep(0.5)
if q.qsize()<3:
print('生产者[%s]生产一个新的包子:【%s】'%(n,count))
q.put(count)
count += 1
q.join() # 等待队列的通知
print('所有的包子都被吃完啦。。') q = queue.Queue()
for i in range(3): # 消费者
c = threading.Thread(target=consumer,args=[i,])
c.start()
for i in range(5): # 生产者
p = threading.Thread(target=producer,args=['Presley',])
p.start()

生产者_消费者模型

生产者[Presley]生产一个新的包子:【1】
消费者[0]号吃掉了包子:【1】
生产者[Presley]生产一个新的包子:【1】
消费者[1]号吃掉了包子:【1】
生产者[Presley]生产一个新的包子:【1】
消费者[2]号吃掉了包子:【1】
生产者[Presley]生产一个新的包子:【1】
生产者[Presley]生产一个新的包子:【1】
消费者[0]号吃掉了包子:【1】
消费者[1]号吃掉了包子:【1】
所有的包子都被吃完啦。。
所有的包子都被吃完啦。。
所有的包子都被吃完啦。。
所有的包子都被吃完啦。。
所有的包子都被吃完啦。。
生产者[Presley]生产一个新的包子:【2】
生产者[Presley]生产一个新的包子:【2】
生产者[Presley]生产一个新的包子:【2】
消费者[2]号吃掉了包子:【2】
消费者[0]号吃掉了包子:【2】
生产者[Presley]生产一个新的包子:【2】
消费者[1]号吃掉了包子:【2】
生产者[Presley]生产一个新的包子:【2】
消费者[2]号吃掉了包子:【2】
消费者[1]号吃掉了包子:【2】
所有的包子都被吃完啦。。
所有的包子都被吃完啦。。
所有的包子都被吃完啦。。
所有的包子都被吃完啦。。
所有的包子都被吃完啦。。
生产者[Presley]生产一个新的包子:【3】
生产者[Presley]生产一个新的包子:【3】
生产者[Presley]生产一个新的包子:【3】
消费者[1]号吃掉了包子:【3】
消费者[0]号吃掉了包子:【3】
生产者[Presley]生产一个新的包子:【3】
消费者[2]号吃掉了包子:【3】
生产者[Presley]生产一个新的包子:【3】
消费者[2]号吃掉了包子:【3】
消费者[0]号吃掉了包子:【3】
所有的包子都被吃完啦。。
所有的包子都被吃完啦。。
所有的包子都被吃完啦。。
所有的包子都被吃完啦。。
所有的包子都被吃完啦。。
生产者[Presley]生产一个新的包子:【4】
消费者[1]号吃掉了包子:【4】
生产者[Presley]生产一个新的包子:【4】
消费者[2]号吃掉了包子:【4】
生产者[Presley]生产一个新的包子:【4】
消费者[0]号吃掉了包子:【4】
生产者[Presley]生产一个新的包子:【4】
生产者[Presley]生产一个新的包子:【4】
.
.
.
.
....

result

Python_queue单项队列的更多相关文章

  1. Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)

    Counter(计数器) 是一个字典的子类,存储形式同样为字典,其中存储的键为字典的元素,值为元素出现的次数,在使用之前我们需要先导入文件 import collections 初始化一个计数器 im ...

  2. 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)

    Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuq ...

  3. python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数

    上节内容回顾:C语言为什么比起他语言块,因为C 会把代码变异成机器码Pyhton 的 .pyc文件是什么python 把.py文件编译成的.pyc文件是Python的字节码, 字符串本质是 字符数组, ...

  4. python基础知识4——collection类——计数器,有序字典,默认字典,可命名元组,双向队列

    1.计数器(counter) Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能  Counter 我们从中挑选一些相对常用的方法来举例: 在上面的例子 ...

  5. Python学习笔记——基础篇2【第三周】——计数器、有序字典、元组、单(双)向队列、深浅拷贝、函数、装饰器

    目录 1.Python计数器Counter 2.Python有序字典OrderredDict 3.Python默认字典default 4.python可命名元组namedtuple 5.Python双 ...

  6. Java数据结构和算法(五)——队列

    前面一篇博客我们讲解了并不像数组一样完全作为存储数据功能,而是作为构思算法的辅助工具的数据结构——栈,本篇博客我们介绍另外一个这样的工具——队列.栈是后进先出,而队列刚好相反,是先进先出. 1.队列的 ...

  7. java算法-单向队列

    队列是一种:先进先出,后进后出的数据结构 单项队列: 从前面删除元素,从后面插入元素,跟现实中排队是一样的道理 这里我们用指针移动位置的方法.因为数组删除元素,如果我们要跟现实中排队效果一样,就需要移 ...

  8. queue之#单向消息队列

    import queue q = queue.Queue() #创建一个单项队列qsize 查看这个单项队列元素的个数empty 与 clear功能是一样的full 是用来查看这个队列是否填满了,队列 ...

  9. deque-->collections之#双向消息队列

    deque 双向队列单项队列 方法: append #往右边添加一个appendleft #左边添加clear #清空队列count #看看这个队列里某个元素出现了多少次extend #从右边多个元素 ...

随机推荐

  1. A.02.01—功能定义—一般定义

    二章将属于较轻松的内容,整个过程也会主要以文字描述为主. 最常见的功能定义为按使用操作来定义,如下面的例子是最普通的: 1)用户将雨刮开关打至高速档,雨刮以高速速率刮刷 2)在电源档位为OFF时,用户 ...

  2. mongodb 3.6 集群搭建:分片+副本集

    mongodb是最常用的nosql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  3. 彻底理解cookie,session,token

    发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应,  尤其是我不用 ...

  4. Python常用模块-时间模块

    在写代码的过程中,我们常常需要与时间打交道,在python中,与时间处理有关的模块有time,datetime和calendar.,这里主要介绍time和datetime模块 在python中,表示时 ...

  5. 微服务之服务中心—zookeeper

    微服务中的服务注册与发现 传统的项目中,某个服务访问另一个服务,可以通过在配置文件中记录其他服务静态地址的形式进行访问,通常这个配置文件也很少更新,模式如下图: 而在微服务中,每个功能可能都是一个独立 ...

  6. crm 权限设计

    先在项目中创建  app rbac的models.py from django.db import models class Permission(models.Model): "" ...

  7. Java设计模式之抽象工厂

    概述 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式 ...

  8. Html一些特殊字符(Html语法字符)的一种表达方式

      空格 & & < < > > " " &qpos; '

  9. sql server 2008怎样导入mdf,ldf文件,怎样解决导入mdf,ldf文件时出现附加数据库错误的问题

    废话不多说,直入主题吧. 1:打开sql server 2008,右键数据库-->附加 2:这时出现这个界面点击添加 3:打开数据库实例的安装目录,打开DATA文件夹;(如我的实例目录地址为:D ...

  10. Xml序列化 详解

    http://www.cnblogs.com/kissdodog/archive/2013/12/10/3468385.html