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中使用第三方库xlrd来读取Excel示例
Apr 05 Python
使用Python对Excel进行读写操作
Mar 30 Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
django的登录注册系统的示例代码
May 14 Python
解决python写入带有中文的字符到文件错误的问题
Jan 31 Python
网易2016研发工程师编程题 奖学金(python)
Jun 19 Python
python实现ip地址查询经纬度定位详解
Aug 30 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
如何理解python中数字列表
May 29 Python
Python logging模块异步线程写日志实现过程解析
Jun 30 Python
Jupyter notebook 不自动弹出网页的解决方案
May 21 Python
使用Python开发贪吃蛇游戏 SnakeGame
Apr 30 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
DC这些乐高系列动画电影你看过几部?
2020/04/09 欧美动漫
MySql中正则表达式的使用方法描述
2008/07/30 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
FireFox JavaScript全局Event对象
2009/06/14 Javascript
JavaScript 学习笔记(四)
2009/12/31 Javascript
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
Vue.js之slot深度复制详解
2017/03/10 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
angular过滤器实现排序功能
2017/06/27 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
JavaScript实现百度搜索框效果
2020/03/26 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
微信自定义分享链接信息(标题,图片和内容)实现过程详解
2019/09/04 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
[04:44]DOTA2英雄梦之声_第12期_矮人直升机
2014/06/21 DOTA
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python字符串格式化输出方法分析
2016/04/13 Python
python3处理含有中文的url方法
2018/05/10 Python
python实践项目之监控当前联网状态详情
2019/05/23 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
使用python计算三角形的斜边例子
2020/04/15 Python
python合并多个excel文件的示例
2020/09/23 Python
一道写SQL的面试题和答案
2013/11/19 面试题
法律专业个人实习自我鉴定
2013/09/23 职场文书
文明家庭先进事迹材
2014/01/27 职场文书
淘宝中秋节活动方案
2014/01/31 职场文书
党员干部承诺书
2014/03/25 职场文书
统计专业自荐书
2014/07/06 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
彻底卸载VMware虚拟机的超详细步骤记录
2022/07/15 Servers