queue (队列)

主要作用

  1. 解耦,使程序实现松耦合(一个模块修改不会影响其他模块)
  2. 提高效率

队列与列表的关系

队列中数据只有一份,取出就没有了,区别于列表,列表数据取出只是复制了一份

分类

FIFO (先入先出)

queue.Queue(maxsize=0)
示例:

import queueq = queue.Queue()
q.put(1)
q.put(2)
q.put(3)print(q.get())
print(q.get())
print(q.get())

输出结果:
1
2
3

LIFO (后入先出)

queue.LifoQueue
示例:

import queueq = queue.LifoQueue()
q.put(1)
q.put(2)
q.put(3)print(q.get())
print(q.get())
print(q.get())

输出结果:
3
2
1

PriorityQueue (数据可设置优先级)

queue.PriorityQueue
同优先级的按照 ASCII 排序
示例:

import queueq = queue.PriorityQueue()
q.put((2, '2'))
q.put((1, '1'))
q.put((3, '3'))
q.put((1, 'a'))print(q.get())
print(q.get())
print(q.get())
print(q.get())

输出结果:
(1, '1')
(1, 'a')
(2, '2')
(3, '3')

queue 模块

queue 模块中有 Queue 类,LifoQueue、PriorityQueue 都继承了 Queue

maxsize

maxsize 是实例化 Queue 类时的一个参数,默认为 0
Queue(maxsize=0) 可以控制队列中数据的容量

put

Queue.put(block=True, timeout=None)
block 用于设置是否阻塞, timeout 用于设置阻塞时等待时长
put_nowait() = put(block=False)

阻塞

当队列满了之后,put 就会阻塞,一直等待队列不再满时向里面添加数据

不阻塞

当队列满了之后,如果设置 put 不阻塞,或者等待时长到了之后会报错:queue.Full

get

Queue.get(block=True, timeout=None)
get_nowait() = get(block=False)

阻塞

当队列空了之后,get 就会阻塞,一直等待队列中有数据后再获取数据

不阻塞

当队列空了之后,如果设置 get 不阻塞,或者等待时长到了之后会报错:_queue.Empty

full & empty

Queue.empty()/Queue.full() 用于判断队列是否为空、满
尽量使用 qsize 代替

qsize

Queue.qsize() 用于获取队列中大致的数据量
注意:在多线程的情况下不可靠
因为在获取 qsize 时,其他线程可能又对队列进行操作了

join

join 会在队列存在未完成任务时阻塞,等待队列无未完成任务,需要配合 task_done 使用

task_done

执行一次 put 会让未完成任务 +1 ,但是执行 get 并不会让未完成任务 -1 ,需要使用 task_done 让未完成任务 -1 ,否则 join 就无法判断
队列为空时执行会报错:ValueError: task_done() called too many times
示例:

import queue
import threading
import timedef q_put():for i in range(10):q.put('1')while True:q.put('2')time.sleep(1)def q_get():while True:temp = q.get()q.task_done()print(temp)time.sleep(0.3)q = queue.Queue()
t1 = threading.Thread(target=q_put)
t2 = threading.Thread(target=q_get)
t1.start()
t2.start()
q.join()
print('queue is empty now')

主线程执行到 q.join 就开始阻塞,当 t2 线程将队列中的数据全部取出之后,主线程才继续执行。
如果将 task_done 注释掉主线程就永远阻塞在 q.join,不再继续向下执行

生产者消费者模型(主要用于解耦)

在多线程开发当中,如果生产线程处理速度很快,而消费线程处理速度很慢,那么生产线程就必须等待消费线程处理完,才能继续生产数据。同样的道理,如果消费线程的处理能力大于生产线程,那么消费线程就必须等待生产线程。为了解决这个问题于是引入了生产者和消费者模式
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
示例:

import threading
import time
import queuedef producer():count = 1while 1:q.put('No.%i' % count)print('Producer put No.%i' % count)time.sleep(1)count += 1def customer(name):while 1:print('%s get %s' % (name, q.get()))time.sleep(1.5)q = queue.Queue(maxsize=5)
p = threading.Thread(target=producer, )
c = threading.Thread(target=customer, args=('jack', ))
p.start()
c.start()

Python queue (队列)相关推荐

  1. Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)

    一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 1 简单的启动线程语法 2 def run(na ...

  2. python queue队列

    作用: 解耦:使程序直接实现松耦合,修改一个函数,不会有串联关系. 提高处理效率:FIFO = 现进先出,LIFO = 后入先出. 队列: 队列可以并发的派多个线程,对排列的线程处理,并切每个需要处理 ...

  3. python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...

    python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构 ...

  4. python 实现队列功能 queue insert() pop()

    def calculate_detection_num(self, calcu_list, detect_num):"""计算一段次数内平均识别个数"" ...

  5. Python 线程队列 Queue – FIFO - Python零基础入门教程

    目录 一.Python 线程队列分类 二.Python 线程先进先出队列 Queue 简介 三.Python 线程先进先出队列 Queue 常用函数 四.Python 线程先进先出队列 Queue 使 ...

  6. python 队列实现_Python Queue队列实现线程通信

    queue 模块下提供了几个阻塞队列,这些队列主要用于实现线程通信.在 queue 模块下主要提供了三个类,分别代表三种队列,它们的主要区别就在于进队列.出队列的不同. 关于这三个队列类的简单介绍如下 ...

  7. python 优先队列_Python Queue队列实现线程通信

    queue 模块下提供了几个阻塞队列,这些队列主要用于实现线程通信.在 queue 模块下主要提供了三个类,分别代表三种队列,它们的主要区别就在于进队列.出队列的不同.关于这三个队列类的简单介绍如下: ...

  8. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  9. python 消息队列 get是从队首还是队尾取东西_Python -- queue队列模块

    import Queue myqueue = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限.可通过Queue的构造函数的 ...

最新文章

  1. java线程池_Java多线程并发:线程基本方法+线程池原理+阻塞队列原理技术分享...
  2. java圆饼图插件_饼图----插件
  3. c++ 暂停功能_2020.10.16撸友简报:NC资本澄清;去嗨皮打赏交易
  4. [论文写作] vscode + latex
  5. RIP路由协议基本配置
  6. mysql long varchar2_案例:Oracle数据库long查询结果转换为varchar2类型方法的操作步骤...
  7. vivado2018.3根据板卡Boards直接创建工程(比如basys3和Arty A7)
  8. 【以太坊开发】发币指南--基础篇
  9. 利用函数指针实现累加
  10. Linux文件夹打包拷贝到window下
  11. cs229 机器学习
  12. 详析百度“原创保护”使用规范,及如何推送原创文章链接?
  13. Linux中断子系统(二)中断控制器GIC驱动分析
  14. 【转】Downgrade iOS 4 to OS 3.1.3/3.1.2 (iPhone, iPod Touch)
  15. 虚拟机Ubuntu下共享文件夹MyShare不显示
  16. 创造与魔法服务器维护后必刷鸟吗,创造与魔法云斑鹦鸟位置必刷点2020 刷新时间和地点介绍...
  17. POCO软件测试自学,自动化UI测试工具airtest 之V2.2 airtest文档学习POCO
  18. LM324运放过流延时自锁电路
  19. 常用PythonGUI自动化测试工具
  20. 专利挖掘文章研读笔记

热门文章

  1. 书 | Springer | 时空无监督学习:使用基于图技术和深度神经网络的现代计算机视觉方法
  2. Blizzard Something
  3. 《Visual Studio 程序员箴言》读书笔记
  4. 将centos系统时间修改为上海时区(CST)
  5. Python3_01(Linux基础)
  6. 怎样用FLASHFXP 在服务器空间复制文件到另一个目录
  7. 51单片机 | 中断系统
  8. 必须掌握sprintf函数的用法
  9. keytool 用法总结
  10. 基于误差状态卡尔曼滤波惯性导航理论