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中的算数运算符的用法
May 13 Python
Python中利用sqrt()方法进行平方根计算的教程
May 15 Python
Python的自动化部署模块Fabric的安装及使用指南
Jan 19 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
Jul 27 Python
python实现随机梯度下降(SGD)
Mar 24 Python
Python查找第n个子串的技巧分享
Jun 27 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
Dec 06 Python
python自动化测试之DDT数据驱动的实现代码
Jul 23 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
Apr 21 Python
python文件及目录操作代码汇总
Jul 08 Python
python 监控logcat关键字功能
Sep 04 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
destoon二次开发常用数据库操作
2014/06/21 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
javascript 拖动表格行实现代码
2011/05/05 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
js 获取元素在页面上的偏移量的方法汇总
2015/04/13 Javascript
详解JS面向对象编程
2016/01/24 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
2016/08/01 Javascript
功能强大的Bootstrap使用手册(一)
2016/08/02 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
Node.js引入UIBootstrap的方法示例
2018/05/11 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
vue 实现单选框设置默认选中值
2019/11/07 Javascript
python操作日期和时间的方法
2014/03/11 Python
Python中GIL的使用详解
2018/10/03 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
Python二维码生成识别实例详解
2019/07/16 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
python opencv实现图像配准与比较
2021/02/09 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
html5开发之viewport使用
2013/10/17 HTML / CSS
phpquery中文手册
2021/03/18 PHP
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
智乐游戏测试笔试题
2014/05/21 面试题
AJax面试题
2014/11/25 面试题
基层干部十八大感言
2014/01/19 职场文书
化学教学随笔感言
2014/02/19 职场文书
《逃家小兔》教学反思
2014/02/23 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers