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中的__new__特殊方法
Jun 02 Python
python爬虫爬取快手视频多线程下载功能
Feb 28 Python
对python中的logger模块全面讲解
Apr 28 Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
python的数学算法函数及公式用法
Nov 18 Python
使用Python画了一棵圣诞树的实例代码
Nov 27 Python
python基于Kivy写一个图形桌面时钟程序
Jan 28 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
Mar 02 Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
php _autoload自动加载类与机制分析
2012/02/10 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
2013/06/01 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
PHP时间和日期函数详解
2015/05/08 PHP
php实现的双色球算法示例
2017/06/20 PHP
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
jQuery动态添加
2016/04/07 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
JS动态生成年份和月份实例代码
2017/02/04 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
python之Character string(实例讲解)
2017/09/25 Python
Python实现的径向基(RBF)神经网络示例
2018/02/06 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
英国伦敦的睡衣品牌:Asceno
2019/10/06 全球购物
车间班长岗位职责
2013/11/30 职场文书
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
业务员薪酬管理制度
2014/01/15 职场文书
《在山的那边》教学反思
2014/02/23 职场文书
社区维稳工作方案
2014/06/06 职场文书
校本教研活动总结
2014/07/01 职场文书
篮球兴趣小组活动总结
2014/07/07 职场文书
单位作风建设自查报告
2014/10/23 职场文书
工作能力自我评价2015
2015/03/05 职场文书
简历自我评价模板
2015/03/11 职场文书
Go timer如何调度
2021/06/09 Golang
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python