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抓取网页内容示例分享
Feb 24 Python
Python中的True,False条件判断实例分析
Jan 12 Python
python通过pil将图片转换成黑白效果的方法
Mar 16 Python
python自定义异常实例详解
Jul 11 Python
启动targetcli时遇到错误解决办法
Oct 26 Python
Python实现嵌套列表去重方法示例
Dec 28 Python
python3+PyQt5实现拖放功能
Apr 24 Python
python使用tornado实现简单爬虫
Jul 28 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
Sep 03 Python
Python解决线性代数问题之矩阵的初等变换方法
Dec 12 Python
基于python实现操作git过程代码解析
Jul 27 Python
Python爬虫破解登陆哔哩哔哩的方法
Nov 17 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
yii框架中的Url生产问题小结
2012/01/16 PHP
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
linux下安装php的memcached客户端
2014/08/03 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
python+pyqt实现右下角弹出框
2017/10/26 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
Python如何实现转换URL详解
2019/07/02 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
解决TensorFlow模型恢复报错的问题
2020/02/06 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
python将字典内容写入json文件的实例代码
2020/08/12 Python
通过代码实例了解Python sys模块
2020/09/14 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
python 实现波浪滤镜特效
2020/12/02 Python
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
25道Java面试题集合
2013/05/21 面试题
自荐信如何“自荐”
2013/10/24 职场文书
大学生个人求职信例文
2014/07/07 职场文书
加强作风建设心得体会
2014/10/22 职场文书
行政文员岗位职责
2015/02/04 职场文书
遗愿清单观后感
2015/06/09 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书