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 相关文章推荐
Python2.5/2.6实用教程 入门基础篇
Nov 29 Python
Python基于正则表达式实现文件内容替换的方法
Aug 30 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
python 字典中取值的两种方法小结
Aug 02 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
Aug 09 Python
Python终端输出彩色字符方法详解
Feb 11 Python
Python安装依赖(包)模块方法详解
Feb 14 Python
Python的PIL库中getpixel方法的使用
Apr 09 Python
基于Python实现视频的人脸融合功能
Jun 12 Python
无惧面试,带你搞懂python 装饰器
Aug 17 Python
python的数学算法函数及公式用法
Nov 18 Python
python画条形图的具体代码
Apr 20 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
关于UEditor编辑器远程图片上传失败的解决办法
2012/08/31 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
php简单图像创建入门实例
2015/06/10 PHP
php冒泡排序与快速排序实例详解
2015/12/07 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
php基于Redis消息队列实现的消息推送的方法
2018/11/28 PHP
PHP7 新增常量
2021/03/09 PHP
FireFox JavaScript全局Event对象
2009/06/14 Javascript
jquery 插件开发方法小结
2009/10/23 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
jQuery grep()方法详解及实例代码
2016/10/30 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
vue项目在线上服务器访问失败原因分析
2020/08/14 Javascript
python访问sqlserver示例
2014/02/10 Python
利用python操作SQLite数据库及文件操作详解
2017/09/22 Python
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
python web框架中实现原生分页
2019/09/08 Python
PyQt5实现登录页面
2020/05/30 Python
Python3使用tesserocr识别字母数字验证码的实现
2021/01/29 Python
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
女方婚礼新郎答谢词
2014/01/11 职场文书
护士检查书
2014/01/17 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
机关道德讲堂实施方案
2014/03/15 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
科学发展观标语
2014/10/08 职场文书
毕业赠语大全
2015/06/23 职场文书
初中班主任心得体会
2016/01/07 职场文书
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python