一、Queue

Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递

队列在多线程中可以共享,替代全局变量,无需加互斥锁。

队列可以并发的派多个线程,对排列的线程处理,并且每个需要处理线程只需要将请求的数据放入队列容器的内存中,线程不需要等待,当排列完毕处理完数据后,线程再准时来取数据即可。请求数据的线程只与这个队列容器存在关系,处理数据的线程down掉不会影响到请求数据的线程,队列会派给其他线程处理这分数据,它实现了解耦,提高效率。

队列内会有一个有顺序的容器,列表与这个容器是有区别的,列表中数据虽然是排列的,但数据被取走后还会保留,而队列中这个容器的数据被取后将不会保留。当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用。

二、Python四种类型的队例:

Queue:FIFO 即first in first out 先进先出

LifoQueue:LIFO 即last in first out 后进先出

PriorityQueue:优先队列,级别越低,越优先

deque:双边队列

from queue import Queue, LifoQueue, PriorityQueue

1、Queue 先进先出队列:

q = Queue(maxsize=5)

初始化一个队列,默认是不限定队列的长度,也可以通过参数指定队列中数据的maxsize,如果maxsize小于或者等于0,队列大小没有限制。

put(i,timeout=2) 方法向队列中添加元素,timeout以设置队列中数据满了之后的等待时间(默认一直等待)

q.put(999, block=False) # block=False,往队列中添加数据,不等待,如果队列中数据已满,则会报错

from queue import Queue

q = Queue(maxsize=5) #限定最长为5

for i in range(5):

q.put(i,timeout=2)

print(q)

while not q.empty():

print(q.get())

#输出

0

1

2

3

4

2、LifoQueue 后进先出队列:

创建队列和向队列中添加元素与先进先出队列完全一致

from queue import LifoQueue

q = LifoQueue(5)

for i in range(5):

q.put(i,timeout=2)

print(q)

while not q.empty():

print(q.get())

#输出

4

3

2

1

0

3、优先队列:

from queue import PriorityQueue

import random

q = PriorityQueue(5)

for i in range(5):

x = random.randint(1,99)

q.put((x,f"{i}a"),timeout=2)

print(q)

while not q.empty():

print(q.get())

#输出

(37, '1a')

(44, '2a')

(52, '4a')

(76, '3a')

(77, '0a')

put传递的第一个参数为元组,元组的第一个元素表示数据的优先级

队列中的数据为元组类型:元组的第一个元素表示数据的优先级,优先级越小的先出来

关于优先级,尽量使用数值,如果全是字符串,会按ASCII码进行排序

通用方法

1、往队列中添加数据:q.put( item, block=True, timeout=None)

item为添加的对象

True 往队列中添加数据,如果队列中数据已满,一直等待

bloke=False,往队列中添加数据,不等待,如果队列中数据已满,则报错

timeout不设置,一直等待

timeout设置后等待超过时间则报错

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

2、从队列中移除并返回一个数据:q.get([block[, timeout]])

block和timeout用法与put一致

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

3、判断队列中数据是否为空:empty方法 q.empty()

队列中数据为空,返回True

队列中数据不为空,返回False

4、判断队列中数据是否已满:full q.full()

队列中数据已满,返回True

队列中数据不满,返回False

5、获取队列中任务数量(多少条数据) q.qsize()

6、task_done()

意味着之前入队的一个任务已经完成。由队列的消费者线程调用。每一个get()调用得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕。

如果当前一个join()正在阻塞,它将在队列中的所有任务都处理完时恢复执行(即每一个由put()调用入队的任务都有一个对应的task_done()调用)。

7、join()

阻塞调用线程,直到队列中的所有任务被处理掉。

只要有数据被加入队列,未完成的任务数就会增加。当消费者线程调用task_done()(意味着有消费者取得任务并完成任务),未完成的任务数就会减少。当未完成的任务数降到0,join()解除阻塞。

python判断队列是否为空_python队列Queue相关推荐

  1. python判断一个对象是否为空_python 判断对象是否为空

    在实际的工作当中,我们难免要与空值打交道,相信不少初学者都会写出下面的代码:if a is None: do something. else: do the other thing. 云海天教程网,大 ...

  2. python判断list是否为空_Python - 判断list是否为空

    原博文 2018-02-01 19:15 − Python中判断list是否为空有以下两种方式: 方式一: 1 list_temp = [] 2 if len(list_temp): 3 # 存在值即 ...

  3. python判断变量不为空_Python简洁方法

    写代码的时候,我们都希望自己的代码简洁凝练,不至于显得臃肿难看.以下是我搜罗的在写Python代码时,可以简化的一些语句方法. 多变量赋值 将1,2,3赋值给变量i,j,k. 常规方法: i=1 j= ...

  4. python判断一个对象是否为空的方法_python使用any判断一个对象是否为空的方法

    "python"判断字符串是否为空用什么方法? s为字符串 s.isalnum() 所有字符都是数字或者字母 s.isalpha() 所有字符都是字母 s.isdigit() 所有 ...

  5. python检查列表是否为空_Python 中判断列表是否为空的方法

    在判断列表是否为空时,你更喜欢哪种方式?决定因素是什么? 在 Python 中有很多检查列表是否是空的方式,在讨论解决方案前,先说一下不同方法涉及到的不同因素. 我们可以把判断表达式可以分为两个阵营: ...

  6. python如何判断列表是否为空_python简单判断序列是否为空的方法

    python简单判断序列是否为空的方法 本文实例讲述了python简单判断序列是否为空的方法.分享给大家供大家参考.具体如下: 假设有如下序列: m1 = [] m2 = () m3 = {} 判断他 ...

  7. python判断输入的是空白_python判断是空的实例分享

    在实际的工作当中,我们难免要与空值打交道,相信不少初学者都会写出下面的代码: if a is None: do something.else: do the other thing. 这样写看起来不错 ...

  8. python 判断字符串是否为空,字典是否为空,列表是否为空,元组是否为空的方法

    在python 中 None,空列表[],空元组(),空字典{},0都是被程序判断为False ,所以我们判断对象是否为空可以直接是用if x 或者if not x 的方法来判断对象是否为空 2个方法 ...

  9. python判断字符串是纯数字_python判断字符串是否纯数字的方法

    本文实例讲述了python判断字符串是否纯数字的方法.分享给大家供大家参考.具体如下: 判断的代码如下,通过异常判断不能区分前面带正负号的区别,正则表达式可以根据自己需要比较灵活的写,通过isdigi ...

最新文章

  1. 关键任务应用程序依赖于故障保护存储器
  2. 大数据日知录要点整理
  3. IOS开发之自定义Button(集成三种回调模式)
  4. 安卓开发之Intent系统调用系统相机Camera(中软杯项目)
  5. ue4 classuobject没有成员beginplay_UE4中蓝图函数的泛型
  6. 工程师实战:单片机裸机程序框架是怎样炼成的?
  7. Database2Sharp重要更新之生成Winform框架界面代码
  8. INFORMIX体系效能改善第一步
  9. 服务器是用集成网卡好还是独立网卡好
  10. java实现给图片添加水印(文字水印或图片水印)
  11. J2EE进阶之自定义标签,JSTL标签,国际化 十四
  12. pci 1751 java_PCI-1751快速安装使用手册.PDF
  13. HTTPClient模拟登陆开心网001
  14. 【Linux】快速入门法宝~你值得拥有
  15. everything用于移动硬盘资料管理(二):离线搜索全部移动硬盘
  16. 淘宝双十一前卖家要做好哪些准备?
  17. 我的java开发总结
  18. MATLAB矩阵分块拼装
  19. 解决VirtualBox CentOS8无法调整分辨率的问题
  20. oracle数据库latch,关于Oracle数据库latch: cache buffers chains等待事件

热门文章

  1. 【迅为iMX6Q】开发板:uboot-imx编译
  2. 美学心得(第二百三十一集) 罗国正
  3. 300道SpringCloud面试题及答案(最新整理)
  4. 系统架构设计笔记(13)—— 数据挖掘
  5. 苹果android怎么设置,iphone小圆点怎么设置调出来 自定义手势怎么用
  6. Java实现QQ第三方登录
  7. react 断网提示
  8. squid 简介与安装配置
  9. Win10突然就不能连接网络了怎么办
  10. Android 源码 installPackage 流程分析