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判断Abundant Number的方法
Jun 15 Python
Python3实现Web网页图片下载
Jan 28 Python
Python中内建函数的简单用法说明
May 05 Python
Python 基础知识之字符串处理
Jan 06 Python
Python中模块与包有相同名字的处理方法
May 05 Python
python的构建工具setup.py的方法使用示例
Oct 23 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 Python
python pandas写入excel文件的方法示例
Jun 25 Python
Python中print函数简单使用总结
Aug 05 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
May 26 Python
Python 实现Mac 屏幕截图详解
Oct 05 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中养成7个面向对象的好习惯
2010/07/17 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
PHP版本常用的排序算法汇总
2015/12/20 PHP
PHP生成短网址方法汇总
2016/07/12 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
ajax无刷新动态调用股票信息(改良版)
2008/11/01 Javascript
Javascript this指针
2009/07/30 Javascript
jquery中.add()的使用分析
2013/04/26 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
2013/11/21 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
JavaScript动态生成二维码图片
2016/04/20 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
2017/02/14 Javascript
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
2018/08/20 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
python3使用tkinter实现ui界面简单实例
2014/01/10 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
使用Python对Excel进行读写操作
2017/03/30 Python
python 实现简单的FTP程序
2019/12/27 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
SQL注入攻击的种类有哪些
2013/12/30 面试题
九月份红领巾广播稿
2014/01/22 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
趵突泉导游词
2015/02/03 职场文书
读书笔记怎么写
2015/07/01 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
小学教师教学反思
2016/02/24 职场文书
如何做好员工培训计划?
2019/07/09 职场文书
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript
python四个坐标点对图片区域最小外接矩形进行裁剪
2021/06/04 Python
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server