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通过装饰器检查函数参数数据类型的方法
Mar 13 Python
在服务器端实现无间断部署Python应用的教程
Apr 16 Python
python使用in操作符时元组和数组的区别分析
May 19 Python
python实现图片批量压缩程序
Jul 23 Python
python爬取指定微信公众号文章
Dec 20 Python
Python爬虫实现爬取百度百科词条功能实例
Apr 05 Python
对PyQt5的输入对话框使用(QInputDialog)详解
Jun 25 Python
python实现关闭第三方窗口的方法
Jun 28 Python
在linux系统下安装python librtmp包的实现方法
Jul 22 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
Django配置跨域并开发测试接口
Nov 04 Python
OpenCV实现常见的四种图像几何变换
Apr 01 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程序员的技术瓶颈分析
2011/07/17 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
判断浏览器的javascript版本的代码
2010/09/03 Javascript
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
JavaScript立即执行函数的三种不同写法
2014/09/05 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
2015/08/13 Javascript
分享两段简单的JS代码防止SQL注入
2016/04/12 Javascript
详解Angular4 路由设置相关
2017/08/26 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
Django的信号机制详解
2017/05/05 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
用HTML5的canvas实现一个炫酷时钟效果
2016/05/20 HTML / CSS
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
澳洲小众品牌的集合网站:BNKR
2018/02/23 全球购物
《山谷中的谜底》教学反思
2014/04/26 职场文书
施工安全生产承诺书
2014/05/23 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
幼师辞职信范文
2015/02/27 职场文书
2015年护士节慰问信
2015/03/23 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
比较几种Redis集群方案
2021/06/21 Redis
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server
SpringBoot Http远程调用的方法
2022/08/14 Java/Android