Queue模块解决了生产者、消费者问题,在多线程编程中进行线程通信的时候尤其有用,Queue类封装了加锁解锁的过程。
在Queue模块中有三种不同的队列类,区别是不同队列取出数据的顺序不同。在FIFO队列中,先存进去的数据最先取出来。而在LIFO队列中,最后存进去的数据最取出来。在加权队列中,权值最小的先取出来。
Queue(maxsize=0)类
构造一个先进先出FIFO的队列,maxsize是个整数,指定了队列中最多能够存入的数据个数,如果达到最大数目,将不能再进行插入操作,如果maxsize小于等于0,则对插入的数目没有限制。
LifeQueue(maxsize)类
构造一个后进先出LIFO的队列。其他跟Queue类一样。
PriorityQueue(maxsize)类
加权队列,权值最小的值最先取出。插入的数据格式应该为(priority_number, data)
此外,Queue模块还定义了两个异常类。
Empty
当队列为空却执行get()操作时,将抛出这个异常。
Full
当队列满了,却执行put()操作时将抛出这个异常。
注意:collections模块中的deque是不带加锁解锁功能的。
Queue对象
Queue对象定义了以下公共方法。
qsize():返回队列的大小。
empty():判断队列是否为空。
full():判断队列是否满了。
put(item[,block[,timeout]]):插入元素到队列,如果可选参数block为True,并且timeout为None(默认值),将等待队列中有空闲位置,如果timetout为一个正整数,将最多等待timeout秒,然后抛出Full异常。如果Block为False,在队列中有空余位置时直接执行插入操作,如果没有则抛出异常。
put_nowait(item):相当于put(item,False)
get([block[,timeout]]):从队列中取出一个元素,如果可选参数block为True,并起timeout为None,如果队列为空将等待直到队列中不为空,如果timeout为一个正整数,则只会等待最多timeout秒,然后抛出Empty异常。如果block为False,如果队列非空将直接返回元素,如果为空则抛出异常。
get_nowait():相当于get(False)
join():等待队列中所有的元素被取出并执行。
task_done():当前一个从队列中取出的任务执行完毕之后,通过这个方法告诉队列操作已经执行完毕。
例如下面的例子:
def worker():
while True:
item = q.get()
do_work(item)
q.task_done() q = Queue()
for i in range(num_worker_threads):
t = Thread(target=worker)
t.daemon = True
t.start() for item in source():
q.put(item) q.join() # block until all tasks are done