Queue
模块是提供队列操作的模块,
队列是线程间最常用的交换数据的形式。
该模块提供了
三种队列:
Queue.Queue(maxsize):
先进先出,
maxsize
是队列的大小,
其值为非正数时为无线循环队列
Queue.LifoQueue(maxsize)
:后进先出,相当于栈
Queue.PriorityQueue(maxsize):
优先级队列。
其中
LifoQueue
,
PriorityQueue
是
Queue
的子类。三者拥有以下共同的方法:
qsize():
返回近似的队列大小。
为什么要加“近似”二字呢?因为当该值大于
0
的时候并不保证
并发执行的时候
get()
方法不被阻塞,同样,对于
put()
方法有效。
empty():
返回布尔值,队列为空时,返回
True
,反之返回
False
。
full()
:当设定了队列大小的时候,如果队列满了,则返回
True
,否则返回
False
。
put(item[,block[,timeout]]):
向队列里添加元素
item,block
设置为
False
的时候,
如果队列满了
则抛出
Full
异常。如果
block
设置为
True
,
timeout
设置为
None
时,则会一种等到有空位
的时候再添加进队列;否则会根据
timeout
设定的超时值抛出
Full
异常。
put_nowwait(item):
等价与
put(item,False)
。
block
设置为
False
的时候,如果队列为空,则抛
出
Empty
异常。如果
block
设置为
True
,
timeout
设置为
None
时,则会一种等到有空位的
时候再添加进队列;否则会根据
timeout
设定的超时值抛出
Empty
异常。
get([block[,timeout]]):
从队列中删除元素并返回该元素的值,
如果
timeout
是一个正数,
它会
阻塞最多超时秒数,并且如果在该时间内没有可用的项目,则引发
Empty
异常。
get_nowwait()
:等价于
get(False)
task_done()
:发送信号表明入列任务已完成,经常在消费者线程中用到。
join():
阻塞直至队列所有元素处理完毕,然后再处理其它操作。
(一)源码分析
Queue
模块用起来很简单很简单,但我觉得有必要把该模块的相关源代码贴出来分析
下,会学到不少东西,看看大神们写的代码多么美观,多么结构化模块化,
再想想自己写的
代码,都是泪呀,来学习学习。为了缩减篇幅,源码的注释部分被删减掉。
from time import time as _time
try:
import threading as _threading
except ImportError:
import dummy_threading as _threading
from collections import deque
import heapq
__all__ = ['Empty', 'Full', 'Queue', 'PriorityQueue', 'LifoQueue']
class Empty(Exception):
"Exception raised by Queue.get(block=0)/get_nowait()."
pass
class Full(Exception):
"Exception raised by Queue.put(block=0)/put_nowait()."
pass