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 七种邮件内容发送方法实例
Apr 22 Python
小结Python用fork来创建子进程注意事项
Jul 03 Python
python进阶教程之动态类型详解
Aug 30 Python
python里使用正则的findall函数的实例详解
Oct 19 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
python json.loads兼容单引号数据的方法
Dec 19 Python
python dict 相同key 合并value的实例
Jan 21 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
关于tensorflow的几种参数初始化方法小结
Jan 04 Python
如何在VSCode下使用Jupyter的教程详解
Jul 13 Python
pytorch中index_select()的用法详解
Jan 06 Python
pandas 实现将NaN转换为None
May 14 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
YII Framework框架教程之日志用法详解
2016/03/14 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
js关于精确计算和数值格式化以及直接引js文件
2014/01/28 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
完美解决js传递参数中加号和&号自动改变的方法
2016/10/11 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
python多线程threading.Lock锁用法实例
2014/11/01 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
python实现取余操作的简单实例
2020/08/16 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
小米乌克兰网上商店:Xiaomi.UA
2019/10/29 全球购物
Linux的文件类型
2012/03/07 面试题
保送生自荐信范文
2013/10/06 职场文书
会计主管岗位职责
2014/01/03 职场文书
五一家具促销方案
2014/01/10 职场文书
初中音乐教学反思
2014/01/12 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
地陪导游欢迎词
2015/01/26 职场文书
单位车辆管理制度
2015/08/05 职场文书
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL