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 22 Python
Python subprocess模块功能与常见用法实例详解
Jun 28 Python
python正则表达式去除两个特殊字符间的内容方法
Dec 24 Python
python utc datetime转换为时间戳的方法
Jan 15 Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 Python
解决python tkinter界面卡死的问题
Jul 17 Python
利用python生成照片墙的示例代码
Apr 09 Python
python os模块在系统管理中的应用
Jun 22 Python
TensorFlow中如何确定张量的形状实例
Jun 23 Python
Python 在函数上添加包装器
Jul 28 Python
Python基础之元编程知识总结
May 23 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
Jun 21 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导出word格式数据的代码实例
2013/11/25 PHP
php初始化对象和析构函数的简单实例
2014/03/11 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
2020/09/17 PHP
JavaScript 判断指定字符串是否为有效数字
2010/05/11 Javascript
JQuery自适应IFrame高度(支持嵌套 兼容IE,ff,safafi,chrome)
2011/03/28 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python创建模块及模块导入的方法
2015/05/27 Python
python3学习之Splash的安装与实例教程
2018/07/09 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
Python切片操作去除字符串首尾的空格
2019/04/22 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
英国家庭、花园、汽车和移动解决方案:Easylife Group
2018/05/23 全球购物
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
2016/01/12 面试题
动漫设计与制作专业推荐信
2014/07/07 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS