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中异常(Exception)的汇总
Jan 18 Python
python ansible服务及剧本编写
Dec 29 Python
几种实用的pythonic语法实例代码
Feb 24 Python
Python 25行代码实现的RSA算法详解
Apr 10 Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 Python
Python 使用指定的网卡发送HTTP请求的实例
Aug 21 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
Feb 04 Python
Python pip配置国内源的方法
Feb 14 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 14 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 08 Python
python如何查找列表中元素的位置
May 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
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
PHP基础知识回顾
2012/08/16 PHP
一个PHP的ZIP压缩类分享
2014/05/04 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
Laravel Eloquent ORM 多条件查询的例子
2019/10/10 PHP
IE/FireFox具备兼容性的拖动代码
2007/08/13 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
JavaScript SHA512&SHA256加密算法详解
2015/08/11 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
JS+CSS实现DIV层的展开、收缩效果
2016/01/28 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
JS实现移动端按首字母检索城市列表附源码下载
2017/07/05 Javascript
基于element-ui的rules中正则表达式
2018/09/04 Javascript
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
解决安装pycharm后不能执行python脚本的问题
2019/01/19 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
CSS3制作文字半透明倒影效果的两种实现方式
2014/08/08 HTML / CSS
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
校园歌手大赛策划书
2014/01/17 职场文书
男方父母婚礼答谢词
2014/01/25 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
幼儿园辞职书
2015/02/26 职场文书
Redis 哨兵集群的实现
2021/06/18 Redis
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers