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 07 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
Aug 31 Python
python 列表,数组和矩阵sum的用法及区别介绍
Jun 28 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
Oct 25 Python
python实现实时视频流播放代码实例
Jan 11 Python
tensorflow 重置/清除计算图的实现
Jan 19 Python
在Django中预防CSRF攻击的操作
Mar 13 Python
iPython pylab模式启动方式
Apr 24 Python
浅谈优化Django ORM中的性能问题
Jul 09 Python
基于python实现判断字符串是否数字算法
Jul 10 Python
Python开发简易五子棋小游戏
May 02 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
curl和libcurl的区别简介
2015/07/01 PHP
显示、隐藏密码
2006/07/01 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
超简单JS二级、多级联动的简单实例
2014/02/18 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
如何通过setTimeout理解JS运行机制详解
2019/03/23 Javascript
Vue响应式原理Observer、Dep、Watcher理解
2019/06/06 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python简单计算文件夹大小的方法
2015/07/14 Python
Python制作简易注册登录系统
2016/12/15 Python
Python中常用信号signal类型实例
2018/01/25 Python
Django框架首页和登录页分离操作示例
2019/05/28 Python
python 同时读取多个文件的例子
2019/07/16 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
python中栈的原理及实现方法示例
2019/11/27 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
.NET是怎么支持多种语言的
2015/02/24 面试题
自我评价如何写好?
2014/01/05 职场文书
高中物理教学反思
2014/02/08 职场文书
人力资源经理的岗位职责范本
2014/02/28 职场文书
反对邪教标语
2014/06/30 职场文书
毕业生自荐信范文
2015/03/05 职场文书
初二英语教学反思
2016/02/15 职场文书
导游词之新疆-喀纳斯
2019/10/10 职场文书
springboot中一些比较常用的注解总结
2021/06/11 Java/Android
openstack中的rpc远程调用的方法
2021/07/09 Python