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 相关文章推荐
初步剖析C语言编程中的结构体
Jan 16 Python
python自带的http模块详解
Nov 06 Python
Python在图片中添加文字的两种方法
Apr 29 Python
K-means聚类算法介绍与利用python实现的代码示例
Nov 13 Python
Python中实现变量赋值传递时的引用和拷贝方法
Apr 29 Python
Python实现的远程登录windows系统功能示例
Jun 21 Python
Python爬取成语接龙类网站
Oct 19 Python
Django 创建新App及其常用命令的实现方法
Aug 04 Python
Numpy 多维数据数组的实现
Jun 18 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
Python Flask异步发送邮件实现方法解析
Aug 01 Python
浅析Python模块之间的相互引用问题
Feb 26 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
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
dedecms中使用php语句指南
2014/11/13 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
信息滚动效果的实例讲解
2017/09/18 Javascript
webpack css加载和图片加载的方法示例
2018/09/11 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python写的一个文本编辑器
2014/01/23 Python
Python 字典dict使用介绍
2014/11/30 Python
Python用模块pytz来转换时区
2016/08/19 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
python读取文本中的坐标方法
2018/10/14 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
HTML5边玩边学(1)画布实现方法
2010/09/21 HTML / CSS
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
Solaris操作系统的线程机制
2015/07/28 面试题
中学生团员自我评价分享
2013/12/07 职场文书
接受捐赠答谢词
2014/01/27 职场文书
我爱家乡演讲稿
2014/09/12 职场文书
学校元旦晚会开场白
2015/05/29 职场文书
入党申请书格式
2019/06/20 职场文书
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技