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 相关文章推荐
github配置使用指南
Nov 18 Python
提升Python程序运行效率的6个方法
Mar 31 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
python读写ini配置文件方法实例分析
Jun 30 Python
requests和lxml实现爬虫的方法
Jun 11 Python
Python实现快速计算词频功能示例
Jun 25 Python
python中实现字符串翻转的方法
Jul 11 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
使用python实现对元素的长截图功能
Nov 14 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
Oct 09 Python
Python基础之字符串格式化详解
Apr 21 Python
Python基础之赋值,浅拷贝,深拷贝的区别
Apr 30 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
大师制作的中短波矿石收音机
2020/04/02 无线电
php通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
scrollWidth,clientWidth,offsetWidth的区别
2015/01/13 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
js微信扫描二维码登录网站技术原理
2016/12/01 Javascript
JavaScript数据结构学习之数组、栈与队列
2017/05/02 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
vant 时间选择器--开始时间和结束时间实例
2020/11/04 Javascript
Python中实现对Timestamp和Datetime及UTC时间之间的转换
2015/04/08 Python
详解使用python crontab设置linux定时任务
2016/12/08 Python
解决Python一行输出不显示的问题
2018/12/03 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
keras K.function获取某层的输出操作
2020/06/29 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
上海天奕面试题笔试题
2015/04/19 面试题
90后毕业生的求职信范文
2013/09/21 职场文书
应征英语教师求职信
2013/11/27 职场文书
幼儿园教师个人反思
2014/01/30 职场文书
保护野生动物倡议书
2014/05/16 职场文书
篮球社团活动总结
2014/06/27 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
2015年党员承诺书
2015/01/21 职场文书
Mysql基础之常见函数
2021/04/22 MySQL