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搭建简易服务器分析与实现
Dec 15 Python
Python中集合类型(set)学习小结
Jan 28 Python
用Python的pandas框架操作Excel文件中的数据教程
Mar 31 Python
初学Python函数的笔记整理
Apr 07 Python
Python 网页解析HTMLParse的实例详解
Aug 10 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
通过python3实现投票功能代码实例
Sep 26 Python
Python使用指定字符长度切分数据示例
Dec 05 Python
Python动态声明变量赋值代码实例
Dec 30 Python
python压包的概念及实例详解
Feb 17 Python
Python循环之while无限迭代
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
基于simple_html_dom的使用小结
2013/07/01 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
php使用反射插入对象示例分享
2014/03/11 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
jquery实现盒子下拉效果示例代码
2013/09/12 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
2020/01/08 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
adidas官方旗舰店:德国运动用品制造商
2017/11/25 全球购物
保险专业大专生求职信
2013/10/26 职场文书
房屋租赁意向书
2014/04/01 职场文书
公开承诺书格式
2014/05/21 职场文书
2014年党员学习“三严三实”思想汇报
2014/09/15 职场文书
2016年元旦主持词
2015/07/06 职场文书
初中生物教学反思
2016/02/20 职场文书
使用nginx配置访问wgcloud的方法
2021/06/26 Servers
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript