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 time模块用法实例详解
Sep 11 Python
python统计文本文件内单词数量的方法
May 30 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
python实现石头剪刀布小游戏
Jan 20 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
Jan 08 Python
jupyter notebook 多行输出实例
Apr 09 Python
使用opencv中匹配点对的坐标提取方式
Jun 04 Python
Python xlrd模块导入过程及常用操作
Jun 10 Python
python中如何设置代码自动提示
Jul 15 Python
python怎么删除缓存文件
Jul 19 Python
pip install命令安装扩展库整理
Mar 02 Python
python基础之错误和异常处理
Oct 24 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 小乘法表实现代码
2009/07/16 PHP
PHP请求远程地址设置超时时间的解决方法
2016/10/29 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
JavaScript实用代码小技巧
2018/08/23 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
解决vue admin element noCache设置无效的问题
2019/11/12 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
2020/03/12 Javascript
JavaScript实现单点登录的示例
2020/09/23 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
Python中的进程分支fork和exec详解
2015/04/11 Python
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
美国女性服饰销售网站:Nasty Gal(坏女孩)
2016/07/26 全球购物
新驾驶员个人自我评价
2014/01/03 职场文书
自我评价格式
2014/01/06 职场文书
关于保护环境的建议书
2014/08/26 职场文书
学生检讨书如何写
2014/10/30 职场文书
部门经理助理岗位职责
2015/04/13 职场文书
2015中学教学工作总结
2015/07/22 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技