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 09 Python
Python实现数通设备端口使用情况监控实例
Jul 15 Python
python类中super()和__init__()的区别
Oct 18 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
Feb 16 Python
Python+Django搭建自己的blog网站
Mar 13 Python
python实现归并排序算法
Nov 22 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
Apr 01 Python
python导入不同目录下的自定义模块过程解析
Nov 18 Python
python绘制彩虹图
Dec 16 Python
Python os模块常用方法和属性总结
Feb 20 Python
这样写python注释让代码更加的优雅
Jun 02 Python
Python中OpenCV实现查找轮廓的实例
Jun 08 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&mysql(二)
2006/10/09 PHP
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
快速学习jQuery插件 Form表单插件使用方法
2015/12/01 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
2016/05/24 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
JavaScript——DOM操作——Window.document对象详解
2016/07/14 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
基于jQuery的左滑出现删除按钮的示例
2017/08/29 jQuery
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
Vue编程式跳转的实例代码详解
2019/07/10 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
浅析Python中的多重继承
2015/04/28 Python
使用python加密自己的密码
2015/08/04 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
Python中property函数用法实例分析
2018/06/04 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
2020/02/11 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
运动会广播稿20字
2014/02/18 职场文书
2015年七夕爱情寄语
2015/03/24 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
mysql 索引合并的使用
2021/08/30 MySQL