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 实现归并排序算法
Jun 05 Python
python实现查询IP地址所在地
Mar 29 Python
Python中比较特别的除法运算和幂运算介绍
Apr 05 Python
使用Python程序抓取新浪在国内的所有IP的教程
May 04 Python
python实现将文本转换成语音的方法
May 28 Python
Python 类与元类的深度挖掘 II【经验】
May 06 Python
解决python有时候import不了当前的包问题
Aug 28 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
浅谈Python线程的同步互斥与死锁
Mar 22 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
Apr 20 Python
Python 实现RSA加解密文本文件
Dec 30 Python
实例讲解Python中sys.argv[]的用法
Jun 03 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你的验证码安全码?
2007/01/02 PHP
PHP下对字符串的递增运算代码
2010/08/21 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
2013/08/02 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
python实现从web抓取文档的方法
2014/09/26 Python
Python上传package到Pypi(代码简单)
2016/02/06 Python
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
pytorch 数据集图片显示方法
2018/07/26 Python
详解django中使用定时任务的方法
2018/09/27 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
python感知机实现代码
2019/01/18 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
Melissa香港官网:MDreams
2016/07/01 全球购物
Grow Gorgeous美国官网:只要八天,体验唤醒毛囊后新生的茂密秀发
2018/06/04 全球购物
酒店销售主管岗位职责
2014/01/04 职场文书
西双版纳导游词
2015/02/03 职场文书
英文产品推荐信
2015/03/27 职场文书
龙猫观后感
2015/06/09 职场文书
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP