queue队列模块
import Queue
 myqueue = Queue.Queue(maxsize = 10)
Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。
将一个值放入队列中
myqueue.put(10)
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
将一个值从队列中取出
myqueue.get()
调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。
python queue模块有三种队列:
 1、python queue模块的FIFO队列先进先出。
 2、LIFO类似于堆。即先进后出。
 3、还有一种是优先级队列级别越低越先出来。
针对这三种队列分别有三个构造函数:
 1、class Queue.Queue(maxsize) FIFO 
 2、class Queue.LifoQueue(maxsize) LIFO 
 3、class Queue.PriorityQueue(maxsize) 优先级队列
介绍一下此包中的常用方法:
Queue.qsize() 返回队列的大小 
 Queue.empty() 如果队列为空,返回True,反之False 
 Queue.full() 如果队列满了,返回True,反之False
 Queue.full 与 maxsize 大小对应 
 Queue.get([block[, timeout]])获取队列,timeout等待时间 
 Queue.get_nowait() 相当Queue.get(False)
 非阻塞 Queue.put(item) 写入队列,timeout等待时间 
 Queue.put_nowait(item) 相当Queue.put(item, False)
 Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
 Queue.join() 实际上意味着等到队列为空,再执行别的操作
import Queue
import threading
import time
import random
q = Queue.Queue(0) #当有多个线程共享一个东西的时候就可以用它了
NUM_WORKERS = 3
class MyThread(threading.Thread):
def __init__(self,input,worktype):
self._jobq = input
self._work_type = worktype
threading.Thread.__init__(self)
def run(self):
while True:
if self._jobq.qsize() > 0:
self._process_job(self._jobq.get(),self._work_type)
else:break
def _process_job(self, job, worktype):
doJob(job,worktype)
def doJob(job, worktype):
time.sleep(random.random() * 3)
print"doing",job," worktype ",worktype
if __name__ == '__main__':
print "begin...."
for i inrange(NUM_WORKERS * 2):
q.put(i) #放入到任务队列中去
print "job qsize:",q.qsize()
for x inrange(NUM_WORKERS):
MyThread(q,x).start()
一些需要注意的地方:
1. 阻塞模式
import Queue
q = Queue.Queue(10)
......
        for i in  range(10):
                q.put('A')
                time.sleep(0.5)
这是一段极其简单的代码(另有两个线程也在操作队列q),我期望每隔0.5秒写一个'A'到队列中,但总是不能如愿:间隔时间有时会远远超过0.5秒。原来,Queue.put()默认有 block = True 和 timeou 两个参数。当 block = True 时,写入是阻塞式的,阻塞时间由 timeou 确定。当队列q被(其他线程)写满后,这段代码就会阻塞,直至其他线程取走数据。Queue.put()方法加上 block=False 的参数,即可解决这个隐蔽的问题。但要注意,非阻塞方式写队列,当队列满时会抛出 exception Queue.Full 的异常。
2. 无法捕获 exception Queue.Empty 的异常
while True:
                 ......
                 try:
                         data = q.get()
                 except Queue.Empty:
                         break
我的本意是用队列为空时,退出循环,但实际运行起来,却陷入了死循环。这个问题和上面有点类似:Queue.get()默认的也是阻塞方式读取数据,队列为空时,不会抛出 except Queue.Empty ,而是进入阻塞直至超时。 加上block=False 的参数,问题迎刃而解。
queue队列模块的更多相关文章
- Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fabric模块
		Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fab ... 
- python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)
		今天花了近乎一天的时间研究python关于多线程的问题,查看了大量源码 自己也实践了一个生产消费者模型,所以把一天的收获总结一下. 由于GIL(Global Interpreter Lock)锁的关系 ... 
- Python -- queue队列模块
		一 简单使用 --内置模块哦 import Queuemyqueue = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限. ... 
- Python 源码分析:queue 队列模块
		起步 queue 模块提供适用于多线程编程的先进先出(FIFO)数据结构.因为它是线程安全的,所以多个线程很轻松地使用同一个实例. 源码分析 先从初始化的函数来看: 从这初始化函数能得到哪些信息呢?首 ... 
- jQuery源代码学习之七—队列模块queue
		一.jQuery种的队列模块 jQuery的队列模块主要是为动画模块EFFECTS提供支持,(不过到现在为了支持动画队列的inprogress的出入队还是搞不太清楚),单独抽取出一个命名空间是为了使程 ... 
- 进击的Python【第九章】:paramiko模块、线程与进程、各种线程锁、queue队列、生产者消费者模型
		一.paramiko模块 他是什么东西? paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 先来个实例: import param ... 
- jQuery 源码分析(十一) 队列模块 Queue详解
		队列是常用的数据结构之一,只允许在表的前端(队头)进行删除操作(出队),在表的后端(队尾)进行插入操作(入队).特点是先进先出,最先插入的元素最先被删除. 在jQuery内部,队列模块为动画模块提供基 ... 
- 多进程  multiprocessing 模块进程并发Process;Pool ;Queue队列 、threading模块;
		multiprocessing 模块中的 Process类提供了跨平台的多进程功能,在windows和linux系统都可以使用. 1.首先要实例化一个类,传入要执行的函数. 实例名 = Process ... 
- python2.0_s12_day9之day8遗留知识(queue队列&生产者消费者模型)
		4.线程 1.语法 2.join 3.线程锁之Lock\Rlock\信号量 4.将线程变为守护进程 5.Event事件 * 6.queue队列 * 7.生产者消费者模型 4.6 queue队列 que ... 
随机推荐
- dom 兼容性问题  2 offset
			offsetParent : 离当前节点最近的具有定位属性的祖先节点. 如果所有祖先节点都没有定位属性: 对于一个有定位属性的元素: ie6.7 : offsetParent 是 html 节 ... 
- 《ActiveMQ in Action》例子
			本章内容: 介绍本书中所有例子的使用场景 使用 Maven 编译.运行例子 例子中怎么使用 ActiveMQ 简介 ActiveMQ 不仅实现了 JMS 规范中定义的所有特性,也额外提供了一些特有且有 ... 
- 安装Xcode 7 beta后Xcode 6崩溃的问题
			最新解决方案:把OSX El Capitan升级到Beta 7 (15A263e),Xcode6可使用! 解决方案:http://stackoverflow.com/questions/318035 ... 
- hzau 1205 Sequence Number(二分)
			G. Sequence Number In Linear algebra, we have learned the definition of inversion number: Assuming A ... 
- java 简单解析wsdl
			static void resolve(String wsdl) throws Exception { DocumentBuilderFactory factory = DocumentBuilder ... 
- Rainmeter如何打开控制面板的小程序
			控制面板功能都是通过访问cpl文件来关联它们的,假设你的系统盘在C盘,那么它们的本地在C:\Windows\System32\ Rainmeter通过使用这个应用程序C:\Windows\System ... 
- Redis集群部署3.0
			我用的Mac的终端 ------------------------- 1.Redis简介 centos(5.4) Redis是一个key-value存储系统.和Memcached类似,但是解决了断 ... 
- c++primer 第五章编程练习答案
			5.9.1 #include<iostream> int main() { using namespace std; ; cout << "input first i ... 
- Javasript 内置函数
			var str = 'AAAA';var aTest= new Array(); //['ff'[,'er']] \ new Array(10); \ new Array('ff','fee');va ... 
- CCTextFieldTTF 与 5种常用CCMenuItem
			//继承(class HelloWorld : public cocos2d::CCLayer, public cocos2d::CCTextFieldDelegate) CCTextFieldTTF ... 
