Python Queue模块详解


Posted in Python onNovember 30, 2014

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 29 Python
python 表达式和语句及for、while循环练习实例
Jul 07 Python
一文总结学习Python的14张思维导图
Oct 17 Python
python中Switch/Case实现的示例代码
Nov 09 Python
教你使用python画一朵花送女朋友
Mar 29 Python
VScode编写第一个Python程序HelloWorld步骤
Apr 06 Python
解决python nohup linux 后台运行输出的问题
May 11 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
win10环境下配置vscode python开发环境的教程详解
Oct 16 Python
Python 切分数组实例解析
Nov 07 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
May 26 Python
Python 制作查询商品历史价格的小工具
Oct 20 Python
Python socket C/S结构的聊天室应用实现
Nov 30 #Python
Python open()文件处理使用介绍
Nov 30 #Python
Python fileinput模块使用介绍
Nov 30 #Python
Python 列表list使用介绍
Nov 30 #Python
Python 字典dict使用介绍
Nov 30 #Python
Python 序列化 pickle/cPickle模块使用介绍
Nov 30 #Python
Linux下Python获取IP地址的代码
Nov 30 #Python
You might like
PHP下对字符串的递增运算代码
2010/08/21 PHP
Smarty中调用FCKeditor的方法
2014/10/27 PHP
php防止网站被刷新的方法汇总
2014/12/01 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
从零学JSON之JSON数据结构
2014/05/19 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
Jquery 分页插件之Jquery Pagination
2015/08/25 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
js数组去重的hash方法
2016/12/22 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
js 显示日期时间的实例(时间过一秒加1)
2017/10/25 Javascript
JavaScript使用math.js进行精确计算操作示例
2018/06/19 Javascript
使用gulp构建前端自动化的方法示例
2018/12/25 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
2019/04/26 Javascript
js实现小时钟效果
2020/03/25 Javascript
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
Ruby元编程基础学习笔记整理
2016/07/02 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
2019/01/23 Python
Python3 max()函数基础用法
2019/02/19 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
python超时重新请求解决方案
2019/10/21 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
利用Python实现自动扫雷小脚本
2020/12/17 Python
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
法学毕业生自我鉴定
2013/11/08 职场文书
博士生专家推荐信
2014/09/26 职场文书
承诺书范本
2015/01/21 职场文书
聘任证明怎么写
2015/03/02 职场文书
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python