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中splitlines()方法的使用简介
May 20 Python
python开发之文件操作用法实例
Nov 13 Python
python中的编码知识整理汇总
Jan 26 Python
Python实现进程同步和通信的方法
Jan 02 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
Python对象与引用的介绍
Jan 24 Python
python实现梯度法 python最速下降法
Mar 24 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
解决keras加入lambda层时shape的问题
Jun 11 Python
Python 如何实现数据库表结构同步
Sep 29 Python
神经网络训练采用gpu设置的方式
Mar 03 Python
Pygame Rect区域位置的使用(图文)
Nov 17 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 动态添加记录
2009/03/10 PHP
zend framework重定向方法小结
2016/05/28 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
js中document.getElementByid、document.all和document.layers区分介绍
2011/12/08 Javascript
Jquery网页出现的乱码问题的三种解决方法
2013/06/30 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
2016/03/22 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
jQuery实现可编辑的表格
2019/12/11 jQuery
详细分析vue表单数据的绑定
2020/07/20 Javascript
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
[02:48]DOTA2英雄基础教程 暗夜魔王
2013/12/12 DOTA
python将xml xsl文件生成html文件存储示例讲解
2013/12/03 Python
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
2017/08/31 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
python使用turtle库绘制时钟
2020/03/25 Python
Django实现分页功能
2018/07/02 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
Python3的socket使用方法详解
2020/02/18 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
为什么需要版本控制?
2013/08/08 面试题
上班玩手机检讨书
2014/02/17 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
节约粮食标语
2014/06/18 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2014年终个人工作总结
2014/11/07 职场文书
现实表现证明材料
2015/06/19 职场文书
简短清晨问候语
2015/11/10 职场文书
2016春季幼儿园大班开学寄语
2015/12/03 职场文书
高一数学教学反思
2016/02/18 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle