队列(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. python中socket、进程、线程、协程、池的创建方式和应用场景

    进程 场景 利用多核.高计算型的程序.启动数量有限 进程是计算机中最小的资源分配单位 进程和线程是包含关系 每个进程中都至少有一条线程 可以利用多核,数据隔离 创建 销毁 切换 时间开销都比较大 随着 ...

  2. Elasticsearch6.x和Kibana6.x的安装

    Elasticsearch6.x的安装(centos6.x下) Elasticsearch6.x目前需要至少jdk8的支持,关于如何安装jdk不在讲述.Oracle的推荐安装文档可以在Oracle的网 ...

  3. Red Hat Enterprise Linux AS4, C++ OCCI connect Oracle 9i

    前提是已经安装好Oracle 9i. 1. 下载对应的ORACLE client安装. http://www.oracle.com/technetwork/database/features/inst ...

  4. HDOJ 5542 The Battle of Chibi

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题目大意:在n个数中找长度为m的单调上升子序列有多少种方案 题目思路:DP,离散化,树状数组优化 ...

  5. 2018-2019-2 20175209 实验一《Java开发环境的熟悉》实验报告

    2018-2019-2 20175209 实验一<Java开发环境的熟悉>实验报告 一.实验内容及步骤 1.使用JDK编译.运行简单的Java程序 cd 20175209进入2017520 ...

  6. 启动多个logstash脚本

    一台服务器上启动多个logstash脚本 # more logstash_click #!/bin/sh # Init script for logstash # Maintained by Elas ...

  7. Matlab怎么修改显示数值格式/精度/小数位数

    参考:https://jingyan.baidu.com/article/7f41ecec1ad029593c095c70.html

  8. solr的基础和安装

    下载地址 http://archive.apache.org/dist/lucene/solr/   推荐 http://www.apache.org/dyn/closer.lua/lucene/so ...

  9. 浏览器UI多线程及JavaScript单线程运行机制的理解

    在上一篇博客中,我对jQuery的队列(queue)机制和动画(animate)机制做了一个深入的解析,在animate的实现机制其核心是依靠queue来完成的,其中在jQuery的链式调用部分,之前 ...

  10. Docker下安装GitLab

    1.需要先安装Docker和Docker Compose,参考:https://www.cnblogs.com/hackyo/p/9280042.html 2.配置GitLab SSL(可跳过): m ...