python 队列详解及实例代码


Posted in Python onOctober 18, 2016

队列特性:先进先出(FIFO)——先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。

python 队列详解及实例代码

Queue模块最常与threading模块一起构成生产-消费者模型,提供了一个适用于多线程编程的先进先出的数据结构,即队列。

该模块源码中包含5个类:

其中,Empty和Full是两个异常类,当队列的Queue.get(block=0)或者调用get_nowait()时,如果队列为空,则抛EmptyException异常。

 同理,当队列的Queue.put(block=0)或者调用put_nowait()时,如果队列为达到maxsize,则抛FullException异常。

其他三个类:

Queue类:典型的队列模型,FIFO先入先出。

class Queue.Queue(maxsize)     maxsize为队列长度,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻                                                                                                                塞,

直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。

LifoQueue类:继承自Queue,类似于堆栈,先入后出。

class Queue.LifoQueue(maxsize)

PriorityQueue类:继承自Queue,优先级队列,级别越低越先出来。

class Queue.PriorityQueue(maxsize)

所以,只要搞定Queue类,就基本搞定Queue模块。

Queue类中常用的方法:

Queue.qsize()

  

返回队列的大小
Queue.empty()

如果队列为空,返回True,反之False
Queue.full()

如果队列满了,返回True,反之False
Queue.full

   与 maxsize 大小对应

Queue.get([block[, timeout]])    获取队列,timeout等待时间 ,调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。

Queue.get_nowait()    相当于Queue.get(False)

Queue.put(item)

  写入队列,timeout等待时间 ,调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第   二个block为可选参数,默认为1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。                                            

Queue.put_nowait(item) 相当Queue.put(item, False)

Queue.task_done()

  在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号

Queue.join()

 实际上意味着等到队列为空,再执行别的操作

一个小的练习实例:

#coding:utf-8
import random, threading, time
import Queue
'''
实现了一个生产线程,用于往队列中添加随机数10个,
实现了一个消费线程,分别消耗奇数随机数和偶数随机数
'''

class producer(threading.Thread):
  def __init__(self,t_name,queue):
    threading.Thread.__init__(self,name=t_name)
    self.data = queue
  def run(self):
    for i in xrange(10):
      random_num = random.randint(1,99)
      print "%s : %s 生产了一个随机数\033[31;0m %d \033[0m放入队列中" % (time.ctime(),self.getName(),random_num)
      self.data.put(random_num)
      time.sleep(1)
    print "生产线程完成!!"


class consumer(threading.Thread):
  def __init__(self,t_name,queue):
    threading.Thread.__init__(self,name=t_name)
    self.data = queue
  def run(self):
    while True:
      try:
        tmp_num = self.data.get(1,5) #定义超时时间5秒
        if tmp_num%2 == 0:
          print "%s : %s 消耗了一个队列中的偶数随机数\033[31;0m %d \033[0m" % (time.ctime(),self.getName(),tmp_num)
          time.sleep(2)
        else:
          print "%s : %s 消耗了一个队列中的奇数随机数\033[31;0m %d \033[0m" % (time.ctime(), self.getName(), tmp_num)
          time.sleep(2)
      except:
        print "消费线程完成!!" #一旦到达超时时间5秒,会抛异常,break退出循环
        break


def main():
  queue = Queue.Queue(0)
  pro = producer('Pro', queue)
  con = consumer('Con', queue)
  pro.start()
  con.start()
  pro.join()
  con.join()
  print 'All threads complete!!!'

if __name__ == '__main__':
  main()

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
Python中实现字符串类型与字典类型相互转换的方法
Aug 18 Python
Python常用算法学习基础教程
Apr 13 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
Sep 08 Python
浅谈Python处理PDF的方法
Nov 10 Python
python中requests和https使用简单示例
Jan 18 Python
Python使用requests发送POST请求实例代码
Jan 25 Python
Python处理CSV与List的转换方法
Apr 19 Python
使用python打印十行杨辉三角过程详解
Jul 10 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
Python文字截图识别OCR工具实例解析
Mar 05 Python
Python Dataframe常见索引方式详解
May 27 Python
Python合并pdf文件的工具
Jul 01 Python
django model去掉unique_together报错的解决方案
Oct 18 #Python
django批量导入xml数据
Oct 16 #Python
python中os模块详解
Oct 14 #Python
python append、extend与insert的区别
Oct 13 #Python
CentOS6.5设置Django开发环境
Oct 13 #Python
Python判断某个用户对某个文件的权限
Oct 13 #Python
python使用str & repr转换字符串
Oct 13 #Python
You might like
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
php判断字符以及字符串的包含方法属性
2008/08/30 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
json简单介绍
2008/06/10 Javascript
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
js取得url地址参数实例
2013/02/22 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
AngularJS 所有版本下载地址
2016/09/14 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
深入Python解释器理解Python中的字节码
2015/04/01 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
Python tempfile模块生成临时文件和临时目录
2020/09/30 Python
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
创业计划书的内容步骤和要领
2014/01/04 职场文书
幼儿园大班毕业教师寄语
2014/04/03 职场文书
医院院务公开实施方案
2014/05/03 职场文书
公司担保书范文
2014/05/21 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
超市店长竞聘书
2015/09/15 职场文书
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL