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的Django框架使用的一些实用建议
Apr 03 Python
python统计字符串中指定字符出现次数的方法
Apr 04 Python
Python实现堆排序的方法详解
May 03 Python
python编程线性回归代码示例
Dec 07 Python
详解用python实现简单的遗传算法
Jan 02 Python
Python中请不要再用re.compile了
Jun 30 Python
python 爬取学信网登录页面的例子
Aug 13 Python
Python socket实现的文件下载器功能示例
Nov 15 Python
Python: 传递列表副本方式
Dec 19 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 Python
pandas提升计算效率的一些方法汇总
May 30 Python
python字符串的多行输出的实例详解
Jun 08 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
php中如何防止表单的重复提交
2013/08/02 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
php实现字符串首字母转换成大写的方法
2015/03/17 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
一个javascript图片阅览组件
2010/11/09 Javascript
加载 Javascript 最佳实践
2011/10/30 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
Angular 路由route实例代码
2016/07/12 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
2016/09/20 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
python实现微信远程控制电脑
2018/02/22 Python
对python中Json与object转化的方法详解
2018/12/31 Python
Python二元赋值实用技巧解析
2019/10/25 Python
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
安全生产投入制度
2014/01/29 职场文书
七夕活动策划方案
2014/08/16 职场文书
暑期培训心得体会
2014/09/02 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书