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
web.py中调用文件夹内模板的方法
Aug 26 Python
Python socket C/S结构的聊天室应用实现
Nov 30 Python
Python hashlib模块用法实例分析
Jun 12 Python
Python3+Appium实现多台移动设备操作的方法
Jul 05 Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 Python
在django-xadmin中APScheduler的启动初始化实例
Nov 15 Python
np.random.seed() 的使用详解
Jan 14 Python
python搜索算法原理及实例讲解
Nov 18 Python
Python 内存管理机制全面分析
Jan 16 Python
pandas map(),apply(),applymap()区别解析
Feb 24 Python
解决jupyter notebook启动后没有token的坑
Apr 24 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 字符串操作入门教程
2006/12/06 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
2019/10/12 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
JS获取当前日期和时间的简单实例
2013/11/19 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
基于VUE选择上传图片并页面显示(图片可删除)
2017/05/25 Javascript
vue动画打包后失效问题的解决方法
2018/09/18 Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
2019/01/09 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
使用python 获取进程pid号的方法
2014/03/10 Python
Python之日期与时间处理模块(date和datetime)
2017/02/16 Python
python3设计模式之简单工厂模式
2017/10/17 Python
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
解决python文件双击运行秒退的问题
2019/06/24 Python
python调用API接口实现登陆短信验证
2020/05/10 Python
Python如何获取文件指定行的内容
2020/05/27 Python
python如何代码集体右移
2020/07/20 Python
python openssl模块安装及用法
2020/12/06 Python
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
建材业务员岗位职责
2013/12/08 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
吃空饷专项整治方案
2014/10/27 职场文书
2015年推普周活动方案
2015/05/06 职场文书
法律进社区活动总结
2015/05/07 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
canvas实现贪食蛇的实践
2022/02/15 Javascript
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers