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实现批量重命名文件的代码
May 25 Python
使用Python构建Hopfield网络的教程
Apr 14 Python
Python自动化运维_文件内容差异对比分析
Dec 13 Python
利用python如何处理百万条数据(适用java新手)
Jun 06 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
Dec 20 Python
python实现websocket的客户端压力测试
Jun 25 Python
python3文件复制、延迟文件复制任务的实现方法
Sep 02 Python
Python调用jar包方法实现过程解析
Aug 11 Python
详解基于python的全局与局部序列比对的实现(DNA)
Oct 07 Python
python excel和yaml文件的读取封装
Jan 12 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 Python
python中%格式表达式实例用法
Jun 18 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
实用函数7
2007/11/08 PHP
php 在线打包_支持子目录
2008/06/28 PHP
php 什么是PEAR?(第二篇)
2009/03/19 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
phpstrom使用xdebug配置方法
2013/12/17 PHP
php实现过滤UBB代码的类
2015/03/12 PHP
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
jquery京东商城双11焦点图多图广告特效代码分享
2015/09/06 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
3种vue路由传参的基本模式
2018/02/22 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
taro 实现购物车逻辑的实例代码
2020/06/05 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
在Python中COM口的调用方法
2019/07/03 Python
wxPython实现分隔窗口
2019/11/19 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
python 两个一样的字符串用==结果为false问题的解决
2020/03/12 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
《和我们一样享受春天》教学反思
2014/02/07 职场文书
竞选宣传委员演讲稿
2014/05/24 职场文书
退休教师追悼词
2015/06/23 职场文书
导游词之镇江焦山
2019/11/21 职场文书