python队列Queue的详解


Posted in Python onMay 10, 2019

Queue

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

基本FIFO队列

class Queue.Queue(maxsize=0)

FIFO即First in First Out,先进先出。Queue提供了一个基本的FIFO容器,使用方法很简单,maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。

举个栗子:

import Queue

q = Queue.Queue()

for i in range(5):
  q.put(i)

while not q.empty():
  print q.get()

输出:

0
1
2
3
4

 LIFO队列

class Queue.LifoQueue(maxsize=0)

LIFO即Last in First Out,后进先出。与栈的类似,使用也很简单,maxsize用法同上

再举个栗子:

import Queue

q = Queue.LifoQueue()

for i in range(5):
  q.put(i)

while not q.empty():
  print q.get()

输出:

4
3
2
1
0

 可以看到仅仅是将Queue.Quenu类替换为Queue.LifiQueue类

优先级队列

class Queue.PriorityQueue(maxsize=0)

构造一个优先队列。maxsize用法同上。

import Queue
import threading

class Job(object):
  def __init__(self, priority, description):
    self.priority = priority
    self.description = description
    print 'Job:',description
    return
  def __cmp__(self, other):
    return cmp(self.priority, other.priority)

q = Queue.PriorityQueue()

q.put(Job(3, 'level 3 job'))
q.put(Job(10, 'level 10 job'))
q.put(Job(1, 'level 1 job'))

def process_job(q):
  while True:
    next_job = q.get()
    print 'for:', next_job.description
    q.task_done()

workers = [threading.Thread(target=process_job, args=(q,)),
    threading.Thread(target=process_job, args=(q,))
    ]

for w in workers:
  w.setDaemon(True)
  w.start()

q.join()

结果

Job: level 3 job
Job: level 10 job
Job: level 1 job
for: level 1 job
for: level 3 job
for: job: level 10 job

 一些常用方法

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异常
  4. 其非阻塞版本为put_nowait等同于put(item, False)

get([block[, timeout]])

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

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

empty()

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

以上所述是小编给大家介绍的python队列Queue详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python设计模式之观察者模式实例
Apr 26 Python
python with statement 进行文件操作指南
Aug 22 Python
python编写暴力破解FTP密码小工具
Nov 19 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
Python中执行存储过程及获取存储过程返回值的方法
Oct 07 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
Nov 16 Python
Python装饰器用法实例总结
May 26 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
Dec 13 Python
python实现石头剪刀布程序
Jan 20 Python
python多线程同步之文件读写控制
Feb 25 Python
python 日志模块 日志等级设置失效的解决方案
May 26 Python
python怎么删除缓存文件
Jul 19 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
May 10 #Python
详解python中的线程与线程池
May 10 #Python
Python实现的爬取百度贴吧图片功能完整示例
May 10 #Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 #Python
Django框架实现分页显示内容的方法详解
May 10 #Python
Django框架验证码用法实例分析
May 10 #Python
Python爬虫实现验证码登录代码实例
May 10 #Python
You might like
php文件上传你必须知道的几点
2015/10/20 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
CSS+JS构建的图片查看器
2006/07/22 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
2016/04/18 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
微信小程序仿朋友圈发布动态功能
2018/07/15 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
python实现斐波那契递归函数的方法
2014/09/08 Python
基于python 爬虫爬到含空格的url的处理方法
2018/05/11 Python
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
Python2包含中文报错的解决方法
2018/07/09 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
对Python3 * 和 ** 运算符详解
2019/02/16 Python
详解Python3之数据指纹MD5校验与对比
2019/06/11 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
气象学专业个人求职信
2014/03/15 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
MySQL高级进阶sql语句总结大全
2022/03/16 MySQL