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中使用copy模块实现列表(list)拷贝
Apr 14 Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 Python
Python抓取框架 Scrapy的架构
Aug 12 Python
Python机器学习之SVM支持向量机
Dec 27 Python
详解tensorflow训练自己的数据集实现CNN图像分类
Feb 07 Python
python实现微信小程序自动回复
Sep 10 Python
python调用其他文件函数或类的示例
Jul 16 Python
python爬虫爬取笔趣网小说网站过程图解
Nov 18 Python
python科学计算之narray对象用法
Nov 25 Python
python关闭占用端口方式
Dec 17 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
Feb 25 Python
Pycharm 跳转回之前所在页面的操作
Feb 05 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
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
PHP中一个控制字符串输出的函数
2006/10/09 PHP
PHP添加Xdebug扩展的方法
2014/02/12 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
微信公众平台开发之配置与请求
2015/08/26 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
javascript克隆对象深度介绍
2012/11/20 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
理解Javascript闭包
2013/11/01 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
JavaScript动态生成二维码图片
2016/04/20 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
pandas 小数位数 精度的处理方法
2018/06/09 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
Django 返回json数据的实现示例
2020/03/05 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
python能否java成为主流语言吗
2020/06/22 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
Android interview questions
2016/12/25 面试题
创业计划书中要认真思考的问题
2013/12/28 职场文书
高三自我评价
2014/02/01 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
李开复演讲稿
2014/05/24 职场文书
爱护公物演讲稿
2014/09/09 职场文书
个人股份合作协议书
2014/10/24 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android