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中声明只包含一个元素的元组数据方法
Aug 25 Python
基于wxpython实现的windows GUI程序实例
May 30 Python
django 2.0更新的10条注意事项总结
Jan 05 Python
Python3.x爬虫下载网页图片的实例讲解
May 22 Python
python实现整数的二进制循环移位
Mar 08 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
pytorch实现建立自己的数据集(以mnist为例)
Jan 18 Python
Python3 selenium 实现QQ群接龙自动化功能
Apr 17 Python
使用Python FastAPI构建Web服务的实现
Jun 08 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 Python
Python实现邮件发送的详细设置方法(遇到问题)
Jan 18 Python
Python数据可视化之Seaborn的安装及使用
Apr 19 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批量上传图片的具体实现方法介绍.
2014/02/26 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
javascript getElementsByClassName实现代码
2010/10/11 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
微信小程序 扎金花简单实例
2017/02/21 Javascript
详解Vue 动态添加模板的几种方法
2017/04/25 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
2017/07/24 Javascript
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
让IDE识别webpack的别名alias的实现方法
2020/05/06 Javascript
python从sqlite读取并显示数据的方法
2015/05/08 Python
Python对象转JSON字符串的方法
2016/04/27 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
Python爬虫常用库的安装及其环境配置
2018/09/19 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
python实现杨氏矩阵查找
2019/03/02 Python
Python自定义一个异常类的方法
2019/06/27 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
关键字throw与throws的用法差异
2016/11/22 面试题
行政申诉状范文
2015/05/20 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python