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日期操作学习笔记
Oct 07 Python
Python实现SVN的目录周期性备份实例
Jul 17 Python
Python函数中*args和**kwargs来传递变长参数的用法
Jan 26 Python
Python基于回溯法子集树模板解决全排列问题示例
Sep 07 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
Dec 14 Python
NLTK 3.2.4 环境搭建教程
Sep 19 Python
python进行TCP端口扫描的实现
Dec 21 Python
Django项目中添加ldap登陆认证功能的实现
Apr 04 Python
Python3中列表list合并的四种方法
Apr 19 Python
Python函数参数定义及传递方式解析
Jun 10 Python
解析python 中/ 和 % 和 //(地板除)
Jun 28 Python
Python如何实现Paramiko的二次封装
Jan 30 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上传后台无法收到数据解决方法
2019/10/28 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
Angularjs中使用Filters详解
2016/03/11 Javascript
JavaScript必知必会(七)js对象继承
2016/06/08 Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
2017/03/04 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python ip正则式
2009/05/07 Python
对python3新增的byte类型详解
2018/12/04 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
pandas的相关系数与协方差实例
2019/12/27 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
python多维数组分位数的求取方式
2020/03/03 Python
python如何求圆的面积
2020/07/01 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
python 两种方法删除空文件夹
2020/09/29 Python
全球采购的街头服饰和帽子:Urban Excess
2020/10/28 全球购物
大一学生假期实习的自我评价
2013/10/12 职场文书
经理管理专业毕业自荐书范文
2014/02/12 职场文书
产品生产计划书
2014/05/07 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
兴趣班停课通知
2015/04/24 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
浅谈MySQL函数
2021/10/05 MySQL
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers