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实现抓取百度搜索结果页的网站标题信息
Jan 22 Python
Python科学计算之Pandas详解
Jan 15 Python
老生常谈python函数参数的区别(必看篇)
May 29 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
python+splinter实现12306网站刷票并自动购票流程
Sep 25 Python
python3 中文乱码与默认编码格式设定方法
Oct 31 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
Dec 18 Python
对django2.0 关联表的必填on_delete参数的含义解析
Aug 09 Python
如何使用Python破解ZIP或RAR压缩文件密码
Jan 09 Python
python输出第n个默尼森数的实现示例
Mar 08 Python
浅谈pycharm导入pandas包遇到的问题及解决
Jun 01 Python
Python接口自动化测试的实现
Aug 28 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
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
PHP下载远程图片的几种方法总结
2017/04/07 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
JQuery中DOM节点的操作与访问方法实例分析
2019/12/23 jQuery
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
[00:11]战神迅矛
2019/03/06 DOTA
20个常用Python运维库和模块
2018/02/12 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
2018/05/25 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
Django实现跨域的2种方法
2019/07/31 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
美国汽车轮胎和轮毂销售网站:Tire Rack
2018/01/11 全球购物
安踏官方商城:anta.cn
2019/12/16 全球购物
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
用Java语言将一个键盘输入的数字转化成中文输出
2013/01/25 面试题
中学劳技课教师的自我评价
2014/02/05 职场文书
预备党员承诺书
2014/03/25 职场文书
骨干教师考核方案
2014/05/09 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
2015年安全生产责任书
2015/01/30 职场文书
2015年校本培训工作总结
2015/07/24 职场文书
pandas 实现将NaN转换为None
2021/05/14 Python
Pytorch可视化的几种实现方法
2021/06/10 Python
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL