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 判断自定义对象类型
Mar 21 Python
vc6编写python扩展的方法分享
Jan 17 Python
python修改字典内key对应值的方法
Jul 11 Python
Python的dict字典结构操作方法学习笔记
May 07 Python
python实现手机通讯录搜索功能
Feb 22 Python
python增加矩阵维度的实例讲解
Apr 04 Python
python 正确保留多位小数的实例
Jul 16 Python
用python生成1000个txt文件的方法
Oct 25 Python
Python如何用filter函数筛选数据
Mar 05 Python
Python urllib2运行过程原理解析
Jun 04 Python
Python Matplotlib库实现画局部图
Nov 17 Python
 python中的元类metaclass详情
May 30 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/02 国漫
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
php 定义404页面的实现代码
2012/11/19 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
JavaScript 函数式编程的原理
2009/10/16 Javascript
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
NodeJs使用Mysql模块实现事务处理实例
2017/05/31 NodeJs
JS实现的随机排序功能算法示例
2017/06/09 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
微信小程序修改数组长度的问题的解决
2019/12/17 Javascript
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
python 拼接文件路径的方法
2018/10/23 Python
python实现统计文本中单词出现的频率详解
2019/05/20 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
.net面试题
2015/12/22 面试题
餐饮主管岗位职责
2013/12/10 职场文书
如何写你的创业计划书
2014/01/07 职场文书
通信工程专业求职信
2014/06/04 职场文书
学雷锋标语
2014/06/25 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
2014年评职称工作总结
2014/11/20 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书
合同纠纷调解书
2015/05/20 职场文书
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers
浅谈Redis缓冲区机制
2022/06/05 Redis