Python Queue模块详细介绍及实例


Posted in Python onDecember 27, 2016

Python Queue模块

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 3.6 性能测试框架Locust安装及使用方法(详解)
Oct 11 Python
Python内建模块struct实例详解
Feb 02 Python
python中int与str互转方法
Jul 02 Python
Python Flask前后端Ajax交互的方法示例
Jul 31 Python
PyQt5实现简单数据标注工具
Mar 18 Python
Python 存储字符串时节省空间的方法
Apr 23 Python
python字符串格式化方式解析
Oct 19 Python
Django 框架模型操作入门教程
Nov 05 Python
Python基础之函数原理与应用实例详解
Jan 03 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
Django serializer优化类视图的实现示例
Jul 16 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
Jan 06 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
Dec 27 #Python
Python 递归函数详解及实例
Dec 27 #Python
python实现二维码扫码自动登录淘宝
Dec 27 #Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 #Python
Python中如何获取类属性的列表
Dec 26 #Python
Python中强大的命令行库click入门教程
Dec 26 #Python
Python快速从注释生成文档的方法
Dec 26 #Python
You might like
多php服务器实现多session并发运行
2006/10/09 PHP
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
迁移PHP版本到PHP7
2015/02/06 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
奇妙的js
2007/09/24 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
JavaScript实现Flash炫光波动特效
2015/05/14 Javascript
一步步教大家编写酷炫的导航栏js+css实现
2016/03/14 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
angularjs $http调用接口的方式详解
2018/08/13 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
vue根据值给予不同class的实例
2018/09/29 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
vuex实现购物车功能
2020/06/28 Javascript
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
python 输入一个数n,求n个数求乘或求和的实例
2018/11/13 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
大二自我鉴定范文
2013/10/05 职场文书
党员公开承诺书和承诺事项
2014/03/25 职场文书
辅导员评语
2014/05/04 职场文书
网络技术专业求职信
2014/07/13 职场文书
购房个人委托书范本
2014/10/11 职场文书
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS
使用Redis实现分布式锁的方法
2022/06/16 Redis