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兔子毒药问题实例分析
Mar 05 Python
使用Python脚本操作MongoDB的教程
Apr 16 Python
给Python中的MySQLdb模块添加超时功能的教程
May 05 Python
python使用epoll实现服务端的方法
Oct 16 Python
python绘制散点图并标记序号的方法
Dec 11 Python
Django中URL的参数传递的实现
Aug 04 Python
Python之关于类变量的两种赋值区别详解
Mar 12 Python
python 在sql语句中使用%s,%d,%f说明
Jun 06 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
python实现图片转字符画
Feb 19 Python
Python 数据结构之十大经典排序算法一文通关
Oct 16 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 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
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
php中关于socket的系列函数总结
2015/05/18 PHP
javascript import css实例代码
2008/07/18 Javascript
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
2008/11/06 Javascript
鼠标事件延时切换插件
2011/03/12 Javascript
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
jquery中ajax学习笔记3
2011/10/16 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
javascript中attribute和property的区别详解
2014/06/05 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
jQuery实现页面顶部下拉广告
2016/12/30 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
js实现弹窗效果
2020/08/09 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
下载给定网页上图片的方法
2014/02/18 Python
python机器学习案例教程——K最近邻算法的实现
2017/12/28 Python
python list格式数据excel导出方法
2018/10/31 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
python处理RSTP视频流过程解析
2020/01/11 Python
信息技术课后反思
2014/04/27 职场文书
小学班级口号
2014/06/09 职场文书
普通党员对照检查材料
2014/08/28 职场文书
2014会计年终工作总结
2014/12/20 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
建议书的格式及范文
2015/09/14 职场文书
新学期家长寄语2016
2015/12/03 职场文书
诉讼和解协议书
2016/03/23 职场文书
MySQL分布式恢复进阶
2022/07/23 MySQL