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中的列表知识点汇总
Apr 14 Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 Python
Python OpenCV实现图片上输出中文
Jan 22 Python
python如何在列表、字典中筛选数据
Mar 19 Python
python奇偶行分开存储实现代码
Mar 19 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
Python3 读、写Excel文件的操作方法
Oct 20 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
Jul 03 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
Jan 16 Python
Python列表倒序输出及其效率详解
Mar 04 Python
OpenCV读取与写入图片的实现
Oct 13 Python
python中altair可视化库实例用法
Jan 26 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 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
Yii2第三方类库插件Imagine的安装和使用
2017/07/06 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
jquery 选项卡效果 新手代码
2011/07/08 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
Vue中引入样式文件的方法
2017/08/18 Javascript
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
[01:18:45]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第三场2月1日
2021/03/11 DOTA
Python 12306抢火车票脚本
2018/02/07 Python
pytorch多进程加速及代码优化方法
2019/08/19 Python
django使用graphql的实例
2020/09/02 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
什么是唯一索引
2015/07/05 面试题
线程同步的方法
2016/11/23 面试题
财务主管自我鉴定
2014/01/17 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
儿园租房协议书范本
2014/12/02 职场文书
销售内勤岗位职责
2015/02/10 职场文书
同学聚会通知短信
2015/04/20 职场文书
倡议书的格式写法
2015/04/28 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书
乔迁新居祝福语
2019/11/04 职场文书
Pygame如何使用精灵和碰撞检测
2021/11/17 Python