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环境变量设置方法
Aug 28 Python
利用ctypes提高Python的执行速度
Sep 09 Python
python 读写txt文件 json文件的实现方法
Oct 22 Python
使用Python对Csv文件操作实例代码
May 12 Python
python利用lxml读写xml格式的文件
Aug 10 Python
python爬虫实战之最简单的网页爬虫教程
Aug 13 Python
tensorflow实现简单的卷积网络
May 24 Python
python+PyQT实现系统桌面时钟
Jun 16 Python
用python代码将tiff图片存储到jpg的方法
Dec 04 Python
python Pexpect 实现输密码 scp 拷贝的方法
Jan 03 Python
基于PyQt4和PySide实现输入对话框效果
Feb 27 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 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
apache+codeigniter 通过.htcaccess做动态二级域名解析
2012/07/01 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
firefo xml 读写实现js代码
2009/06/11 Javascript
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
js取得url地址参数实例
2013/02/22 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
中止javascript执行的方法
2014/02/14 Javascript
jquery实现触发时更新下拉列表内容的方法
2015/12/02 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
2016/01/08 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
2016/08/20 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
Angular 常用指令实例总结整理
2016/12/13 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
angularjs $http实现form表单提交示例
2017/06/09 Javascript
详解Vue 2.0封装axios笔记
2017/06/22 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
js实现select下拉框选择
2020/01/11 Javascript
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
Python中断言Assertion的一些改进方案
2016/10/27 Python
Django中使用极验Geetest滑动验证码过程解析
2019/07/31 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
突破canvas语法限制 让他支持链式语法
2012/12/24 HTML / CSS
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
数控专业大学生的自我鉴定
2013/11/13 职场文书
公司承诺书格式
2014/05/21 职场文书
初中家长意见
2015/06/03 职场文书
学校财务管理制度
2015/08/04 职场文书
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers