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 22 Python
简单的Apache+FastCGI+Django配置指南
Jul 22 Python
深入理解NumPy简明教程---数组3(组合)
Dec 17 Python
python使用tensorflow深度学习识别验证码
Apr 03 Python
Python3模拟curl发送post请求操作示例
May 03 Python
使用python实现简单五子棋游戏
Jun 18 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
Aug 20 Python
Pycharm小白级简单使用教程
Jan 08 Python
使用python turtle画高达
Jan 19 Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 Python
PyTorch安装与基本使用详解
Aug 31 Python
python 中的jieba分词库
Nov 23 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
用文本作数据处理
2006/10/09 PHP
用 PHP5 轻松解析 XML
2006/12/04 PHP
smarty的保留变量问题
2008/10/23 PHP
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
PHP 文本文章分页代码 按标记或长度(不涉及数据库)
2012/06/07 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
详解Python学习之安装pandas
2019/04/16 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
如何保障Web服务器安全
2014/05/05 面试题
私人会所最新创业计划书范文
2014/03/24 职场文书
房产继承公证书
2014/04/09 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
医生见习报告范文
2014/11/03 职场文书
MySQL之高可用集群部署及故障切换实现
2021/04/22 MySQL