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  连接字符串(join %)
Sep 06 Python
python3访问sina首页中文的处理方法
Feb 24 Python
python计算牛顿迭代多项式实例分析
May 07 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
Python爬虫实现(伪)球迷速成
Jun 10 Python
利用pandas进行大文件计数处理的方法
Jul 25 Python
Python装饰器简单用法实例小结
Dec 03 Python
用Python实现校园通知更新提醒功能
Nov 23 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
Python统计学一数据的概括性度量详解
Mar 03 Python
Python Selenium截图功能实现代码
Apr 26 Python
python两种注释用法的示例
Oct 09 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
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
drupal 代码实现URL重写
2011/05/04 PHP
php设置session值和cookies的学习示例
2014/03/21 PHP
php生成验证码函数
2015/10/20 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
2016/08/29 Javascript
JS实现倒计时(天数、时、分、秒)
2016/11/16 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
Vue表情输入组件 微信face表情组件
2019/02/11 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
HTML5+css3:3D旋转木马效果相册
2017/01/03 HTML / CSS
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
Hertz荷兰:荷兰和全球租车
2018/01/07 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
面向对象编程OOP的优点
2013/01/22 面试题
文明礼貌演讲稿
2014/05/12 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
医药公司采购员岗位职责
2015/04/03 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
通讯稿格式及范文
2015/07/22 职场文书