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小技巧之批量抓取美女图片
Jun 06 Python
Python with用法实例
Apr 14 Python
浅谈django model的get和filter方法的区别(必看篇)
May 23 Python
PyChar学习教程之自定义文件与代码模板详解
Jul 17 Python
Python输入二维数组方法
Apr 13 Python
python跳过第一行快速读取文件内容的实例
Jul 12 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 Python
Python 50行爬虫抓取并处理图灵书目过程详解
Sep 20 Python
keras.layer.input()用法说明
Jun 16 Python
使用tensorflow根据输入更改tensor shape
Jun 23 Python
新手必备Python开发环境搭建教程
May 28 Python
详解Python常用的魔法方法
Jun 03 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
安装APACHE
2007/01/15 PHP
Php 构造函数construct的前下划线是双的_
2009/12/08 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
2016/01/20 Javascript
JS未跨域操作iframe里的DOM
2016/06/01 Javascript
关于json字符串与实体之间的严格验证代码
2016/11/10 Javascript
loading动画特效小结
2017/01/22 Javascript
基于JavaScript定位当前的地理位置
2017/04/11 Javascript
页面间固定参数,通过cookie传值的实现方法
2017/05/31 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
vue2.0父子组件间传递数据的方法
2018/08/16 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
vue实现弹幕功能
2019/10/25 Javascript
javascript实现蒙版与禁止页面滚动
2020/01/11 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python实现Linux中的du命令
2017/06/12 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
Python 如何查找特定类型文件
2020/08/17 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
数控专业个人求职信范例
2013/11/29 职场文书
广告业务员岗位职责
2014/02/06 职场文书
党员创先争优公开承诺书
2014/03/28 职场文书
事假请假条范文
2014/04/11 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
个人思想政治总结
2015/03/05 职场文书
小学生运动会广播
2015/08/19 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS
tensorflow中的梯度求解及梯度裁剪操作
2021/05/26 Python
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏