Python Queue模块详解


Posted in Python onNovember 30, 2014

Python中,队列是线程间最常用的交换数据的形式。Queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。

创建一个“队列”对象
import Queue
q = Queue.Queue(maxsize = 10)
Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。

将一个值放入队列中
q.put(10)
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为
1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。

将一个值从队列中取出
q.get()
调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。

Python Queue模块有三种队列及构造函数:
1、Python Queue模块的FIFO队列先进先出。 class Queue.Queue(maxsize)
2、LIFO类似于堆,即先进后出。 class Queue.LifoQueue(maxsize)
3、还有一种是优先级队列级别越低越先出来。 class Queue.PriorityQueue(maxsize)

此包中的常用方法(q = Queue.Queue()):
q.qsize() 返回队列的大小
q.empty() 如果队列为空,返回True,反之False
q.full() 如果队列满了,返回True,反之False
q.full 与 maxsize 大小对应
q.get([block[, timeout]]) 获取队列,timeout等待时间
q.get_nowait() 相当q.get(False)
非阻塞 q.put(item) 写入队列,timeout等待时间
q.put_nowait(item) 相当q.put(item, False)
q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
q.join() 实际上意味着等到队列为空,再执行别的操作

范例:
实现一个线程不断生成一个随机数到一个队列中(考虑使用Queue这个模块)
实现一个线程从上面的队列里面不断的取出奇数
实现另外一个线程从上面的队列里面不断取出偶数

#!/usr/bin/env python
#coding:utf8
import random,threading,time
from Queue import Queue
#Producer thread
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 range(10):  #随机产生10个数字 ,可以修改为任意大小
      randomnum=random.randint(1,99)
      print "%s: %s is producing %d to the queue!" % (time.ctime(), self.getName(), randomnum)
      self.data.put(randomnum) #将数据依次存入队列
      time.sleep(1)
    print "%s: %s finished!" %(time.ctime(), self.getName())
 
#Consumer thread
class Consumer_even(threading.Thread):
  def __init__(self,t_name,queue):
    threading.Thread.__init__(self,name=t_name)
    self.data=queue
  def run(self):
    while 1:
      try:
        val_even = self.data.get(1,5) #get(self, block=True, timeout=None) ,1就是阻塞等待,5是超时5秒
        if val_even%2==0:
          print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(),self.getName(),val_even)
          time.sleep(2)
        else:
          self.data.put(val_even)
          time.sleep(2)
      except:   #等待输入,超过5秒 就报异常
        print "%s: %s finished!" %(time.ctime(),self.getName())
        break
class Consumer_odd(threading.Thread):
  def __init__(self,t_name,queue):
    threading.Thread.__init__(self, name=t_name)
    self.data=queue
  def run(self):
    while 1:
      try:
        val_odd = self.data.get(1,5)
        if val_odd%2!=0:
          print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(), self.getName(), val_odd)
          time.sleep(2)
        else:
          self.data.put(val_odd)
          time.sleep(2)
      except:
        print "%s: %s finished!" % (time.ctime(), self.getName())
        break
#Main thread
def main():
  queue = Queue()
  producer = Producer('Pro.', queue)
  consumer_even = Consumer_even('Con_even.', queue)
  consumer_odd = Consumer_odd('Con_odd.',queue)
  producer.start()
  consumer_even.start()
  consumer_odd.start()
  producer.join()
  consumer_even.join()
  consumer_odd.join()
  print 'All threads terminate!'
 
if __name__ == '__main__':
  main()
Python 相关文章推荐
python 数据的清理行为实例详解
Jul 12 Python
Python生成器generator用法示例
Aug 10 Python
selenium+python自动化测试之页面元素定位
Jan 23 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
Python模块future用法原理详解
Jan 20 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Apr 20 Python
python模拟斗地主发牌
Apr 22 Python
Python函数参数分类原理详解
May 28 Python
浅析Python 字符编码与文件处理
Sep 24 Python
python字典通过值反查键的实现(简洁写法)
Sep 30 Python
Django url 路由匹配过程详解
Jan 22 Python
python自动化八大定位元素讲解
Jul 09 Python
Python socket C/S结构的聊天室应用实现
Nov 30 #Python
Python open()文件处理使用介绍
Nov 30 #Python
Python fileinput模块使用介绍
Nov 30 #Python
Python 列表list使用介绍
Nov 30 #Python
Python 字典dict使用介绍
Nov 30 #Python
Python 序列化 pickle/cPickle模块使用介绍
Nov 30 #Python
Linux下Python获取IP地址的代码
Nov 30 #Python
You might like
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
javascript 命名空间以提高代码重用性
2008/11/13 Javascript
用innerhtml提高页面打开速度的方法
2013/08/02 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
详解webpack es6 to es5支持配置
2017/05/04 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
2017/12/27 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
使用jQuery实现掷骰子游戏
2019/10/24 jQuery
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
如何运行Python程序的方法
2013/04/21 Python
跟老齐学Python之正规地说一句话
2014/09/28 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
python 文件转成16进制数组的实例
2018/07/09 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
python dict如何定义
2020/09/02 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
一年级语文教学反思
2014/02/13 职场文书
小学生评语大全
2014/04/18 职场文书
诚信教育主题班会
2015/08/13 职场文书
外出培训学习心得体会
2016/01/18 职场文书