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 相关文章推荐
详解JavaScript编程中的window与window.screen对象
Oct 26 Python
Python中使用haystack实现django全文检索搜索引擎功能
Aug 26 Python
浅谈Python peewee 使用经验
Oct 20 Python
Python学习之用pygal画世界地图实例
Dec 07 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
Feb 07 Python
python 列表,数组,矩阵两两转换tolist()的实例
Apr 04 Python
解决DataFrame排序sort的问题
Jun 07 Python
python+influxdb+shell编写区域网络状况表
Jul 27 Python
python面试题小结附答案实例代码
Apr 11 Python
python global和nonlocal用法解析
Feb 03 Python
在keras下实现多个模型的融合方式
May 23 Python
Python join()函数原理及使用方法
Nov 14 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执行速度全攻略
2006/10/09 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
2017/06/09 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
使用js获取QueryString的方法小结
2010/02/28 Javascript
js constructor的实际作用分析
2011/11/15 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
js防止表单重复提交的两种方法
2013/09/30 Javascript
js密码强度检测
2016/01/07 Javascript
jQuery增加与删除table列的方法
2016/03/01 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
轮播图组件js代码
2016/08/08 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
微信小程序 swiper制作tab切换实现附源码
2017/01/21 Javascript
ES6新特性八:async函数用法实例详解
2017/04/21 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
Python中的fileinput模块的简单实用示例
2015/07/09 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
python生成器推导式用法简单示例
2019/10/08 Python
pytorch标签转onehot形式实例
2020/01/02 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
生物科学专业个人求职信范文
2013/12/07 职场文书
社团文化节邀请函
2014/01/10 职场文书
小学教师节活动方案
2014/01/31 职场文书
欢迎领导检查标语
2014/06/27 职场文书
无私奉献演讲稿
2014/09/04 职场文书
国庆节标语大全
2014/10/08 职场文书