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切片用法实例教程
Sep 08 Python
Python中矩阵库Numpy基本操作详解
Nov 21 Python
python实现简单tftp(基于udp协议)
Jul 30 Python
python scp 批量同步文件的实现方法
Jan 03 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
Python实现的删除重复文件或图片功能示例【去重】
Apr 23 Python
Python range、enumerate和zip函数用法详解
Sep 11 Python
Python容器使用的5个技巧和2个误区总结
Sep 26 Python
浅谈Python中range与Numpy中arange的比较
Mar 11 Python
python实现斗地主分牌洗牌
Jun 22 Python
Python入门学习之类的相关知识总结
May 25 Python
python数字图像处理实现图像的形变与缩放
Jun 28 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实现的自定义数组排序函数与排序类示例
2016/11/18 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
2018/04/20 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
jQuery事件详解
2017/02/23 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
Node.js编写CLI的实例详解
2017/05/17 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
Python温度转换实例分析
2018/01/17 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
python爬虫实现中英翻译词典
2019/06/25 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
详解Python 循环嵌套
2020/07/09 Python
基于Python正确读取资源文件
2020/09/14 Python
英国123鲜花网站:123 Flowers
2019/07/07 全球购物
开工庆典邀请函范文
2014/01/16 职场文书
考试不及格的检讨书
2014/01/22 职场文书
面试后感谢信
2014/02/01 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
名人传读书笔记
2015/06/26 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
vue项目支付功能代码详解
2022/02/18 Vue.js
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL