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中的cookielib模拟登录网站
Apr 09 Python
Python的Django框架使用入门指引
Apr 15 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
Jun 23 Python
redis之django-redis的简单缓存使用
Jun 07 Python
Python常见MongoDB数据库操作实例总结
Jul 24 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
对python内置map和six.moves.map的区别详解
Dec 19 Python
分享8点超级有用的Python编程建议(推荐)
Oct 13 Python
Python matplotlib可视化实例解析
Jun 01 Python
jupyter notebook指定启动目录的方法
Mar 02 Python
Jupyter Notebook内使用argparse报错的解决方案
Jun 03 Python
如何用Python搭建gRPC服务
Jun 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
PHP4实际应用经验篇(2)
2006/10/09 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
Firefox中autocomplete="off" 设置不起作用Bug的解决方法
2011/03/25 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
简单谈谈json跨域
2016/03/13 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
js两种拼接字符串的简单方法(必看)
2016/09/02 Javascript
详解Bootstrap各式各样的按钮(推荐)
2016/12/13 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
深入理解vue.js中$watch的oldvalue与newValue
2017/08/07 Javascript
vue实现分页组件
2020/06/16 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
2019/11/18 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
Django卸载之后重新安装的方法
2017/03/15 Python
浅谈numpy数组的几种排序方式
2017/12/15 Python
python中列表和元组的区别
2017/12/18 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
python实现视频读取和转化图片
2019/12/10 Python
浅析Python 多行匹配模式
2020/07/24 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
2020/09/04 Python
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
外语系毕业生自荐信范文
2013/12/16 职场文书
决心书标准格式
2014/03/11 职场文书
经典英文广告词
2014/03/18 职场文书
化工专业求职信
2014/07/01 职场文书
家长对孩子的寒假评语
2015/10/09 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS