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 相关文章推荐
phpsir 开发 一个检测百度关键字网站排名的python 程序
Sep 17 Python
举例详解Python中的split()函数的使用方法
Apr 07 Python
python通过索引遍历列表的方法
May 04 Python
python套接字流重定向实例汇总
Mar 03 Python
解决python 输出是省略号的问题
Apr 19 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 Python
Django DRF路由与扩展功能的实现
Jun 03 Python
Numpy 多维数据数组的实现
Jun 18 Python
Python 串口通信的实现
Sep 29 Python
python list的index()和find()的实现
Nov 16 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
第1次亲密接触PHP5(2)
2006/10/09 PHP
用PHP和ACCESS写聊天室(十)
2006/10/09 PHP
php开发过程中关于继承的使用方法分享
2011/06/17 PHP
Laravel框架实现的rbac权限管理操作示例
2019/01/16 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
JavaScript实现的MD5算法完整实例
2016/02/02 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
详解Python命令行解析工具Argparse
2016/04/20 Python
Python 操作文件的基本方法总结
2017/08/10 Python
详解Python判定IP地址合法性的三种方法
2018/03/06 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
pandas中的series数据类型详解
2019/07/06 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
python实现猜数游戏
2020/03/27 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
学生党员思想汇报范文
2014/01/09 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
六一儿童节致辞
2015/07/31 职场文书
医院感染管理制度
2015/08/05 职场文书
工程主管竞聘书
2015/09/15 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
导游词之安徽九华山
2019/09/18 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS