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中的闭包总结
Sep 18 Python
在IIS服务器上以CGI方式运行Python脚本的教程
Apr 25 Python
读取本地json文件,解析json(实例讲解)
Dec 06 Python
python 读取DICOM头文件的实例
May 07 Python
TensorFlow Session使用的两种方法小结
Jul 30 Python
python实现排序算法解析
Sep 08 Python
Python解析Excle文件中的数据方法
Oct 23 Python
详解python配置虚拟环境
Apr 08 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
Nov 15 Python
python 对一幅灰度图像进行直方图均衡化
Oct 27 Python
详解Python调用系统命令的六种方法
Jan 28 Python
Python包argparse模块常用方法
Jun 04 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
农民和部队如何穿矿
2020/03/04 星际争霸
PHP安全编程之加密功能
2006/10/09 PHP
php str_pad 函数用法简介
2009/07/11 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
2018/09/18 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
2013/06/12 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
浅谈Express异步进化史
2017/09/09 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
微信小程序之事件交互操作实例分析
2018/12/03 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
使用python编写android截屏脚本双击运行即可
2014/07/21 Python
Python中的MongoDB基本操作:连接、查询实例
2015/02/13 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
HTML+CSS3 模仿Windows7 桌面效果
2010/06/17 HTML / CSS
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
啤酒销售实习自我鉴定
2013/09/24 职场文书
服装厂厂长岗位职责
2013/12/27 职场文书
民事诉讼代理委托书
2014/10/08 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
详解如何用Python实现感知器算法
2021/06/18 Python
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers