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中的JSON模块
Apr 08 Python
使用Python操作MySQL的一些基本方法
Aug 16 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
Apr 17 Python
python matlibplot绘制多条曲线图
Feb 19 Python
Python定义一个跨越多行的字符串的多种方法小结
Jul 19 Python
seek引发的python文件读写的问题及解决
Jul 26 Python
python正则爬取某段子网站前20页段子(request库)过程解析
Aug 10 Python
python 非线性规划方式(scipy.optimize.minimize)
Feb 11 Python
Python搭建Keras CNN模型破解网站验证码的实现
Apr 07 Python
Python docutils文档编译过程方法解析
Jun 23 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 Python
Python实现制作销售数据可视化看板详解
Nov 27 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
codeigniter框架批量插入数据
2014/01/09 PHP
php中require和require_once的区别说明
2014/02/27 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
js加解密 脚本解密
2008/02/22 Javascript
js模拟类继承小例子
2010/07/17 Javascript
IE6下opacity与JQuery的奇妙结合
2013/03/01 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
在layui.use 中自定义 function 的正确方法
2019/09/16 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
Python利用递归和walk()遍历目录文件的方法示例
2017/07/14 Python
python flask中静态文件的管理方法
2018/03/20 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
前端隐藏出边界内容的实现方法
2016/04/14 HTML / CSS
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
HTML文本属性&颜色控制属性的实现
2019/12/17 HTML / CSS
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
全球知名巧克力品牌:Godiva
2016/07/22 全球购物
计算机应用职专应届生求职信
2013/11/12 职场文书
预备党员思想汇报范文
2014/01/11 职场文书
计算机求职自荐信范文
2014/04/19 职场文书
机电一体化专业毕业生自荐信
2014/06/19 职场文书
2015年党员承诺书
2015/01/21 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
英文辞职信范文
2015/05/13 职场文书
三八节活动主持词
2015/07/04 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书