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 ZipFile模块详解
Nov 01 Python
python发送伪造的arp请求
Jan 09 Python
Python编写百度贴吧的简单爬虫
Apr 02 Python
Python实现k-means算法
Feb 23 Python
python用户管理系统
Mar 13 Python
python3 线性回归验证方法
Jul 09 Python
python 实现矩阵填充0的例子
Nov 29 Python
Python类的绑定方法和非绑定方法实例解析
Mar 04 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
Aug 03 Python
python中scrapy处理项目数据的实例分析
Nov 22 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 Python
分享3个非常实用的 Python 模块
Mar 03 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中去除所有js,html,css代码
2010/10/12 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
svg动画之动态描边效果
2017/02/22 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
微信小程序签到功能
2018/10/31 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
[04:40]DOTA2-DPC中国联赛1月26日Recap集锦
2021/03/11 DOTA
python小技巧之批量抓取美女图片
2014/06/06 Python
Python中input和raw_input的一点区别
2014/10/21 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
python发送邮件脚本
2018/05/22 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
材料物理专业大学毕业生求职信
2013/10/15 职场文书
车间组长岗位职责
2013/12/20 职场文书
交通安全教育制度
2014/02/02 职场文书
亲子拓展活动方案
2014/02/20 职场文书
工商干部先进事迹
2014/05/14 职场文书
基层党建工作汇报材料
2014/08/15 职场文书
物理课外活动总结
2014/08/27 职场文书
城市规划应届生推荐信
2014/09/08 职场文书
优秀员工推荐材料
2014/12/20 职场文书
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python
JS代码编译器Monaco使用方法
2021/06/11 Javascript