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备份Mysql脚本
Aug 11 Python
python使用内存zipfile对象在内存中打包文件示例
Apr 30 Python
Python 稀疏矩阵-sparse 存储和转换
May 27 Python
python3 kmp 字符串匹配的方法
Jul 07 Python
Python中请不要再用re.compile了
Jun 30 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
Oct 24 Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 Python
Python定义一个函数的方法
Jun 15 Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
Feb 25 Python
Python绘制分类图的方法
Apr 20 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
php中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
2018/05/28 PHP
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
JS添加删除DIV的简单实例
2016/07/08 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
js实现飞机大战游戏
2020/08/26 Javascript
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
浅析Python中else语句块的使用技巧
2016/06/16 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
python 重定向获取真实url的方法
2018/05/11 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
python数据挖掘需要学的内容
2019/06/23 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
Python实现对adb命令封装
2020/03/06 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
2020/06/03 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
数学国培研修感言
2014/02/13 职场文书
小学毕业感言300字
2014/02/19 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
建筑管理专业求职信
2014/07/28 职场文书
毕业设计致谢词
2015/05/14 职场文书
成绩单家长意见
2015/06/03 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android
python三子棋游戏
2022/05/04 Python