Queue类简介
Queue类是Python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构--队列,用于生产者和消费者线程之间的信息传递。
队列是线程间最常用的交换数据的形式。这里有个问题,为什么使用队列(Queue),不使用Python原生的列表(List)或字典(Dict)类型呢?原因是List,Dict等数据存储类型都是非线程安全的。在多线程中,为了防止共享资源的数据不同步问题,对资源加锁是个重要的环节。Queue类中实现了所有的锁逻辑,能够满足多线程的需求,所以在满足使用条件的情况下,建议使用队列。
Queue类提供了数据存储和管理的常用方法,如下所示。
1. queue.Queue(maxsize)
用于创建队列,maxsize规定了队列的长度。一旦达到上限,再添加数据会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,表示队列大小没有限制。maxsize的默认值为0。
2. empty()
如果队列为空,返回True,否则返回False。
3. full()
如果队列已满则返回True,否则返回False。
4. qsize()
返回队列的大小。
5. get(block=True, timeout=None)
从队头获取并删除第一个元素。它有两个可选参数:
block:默认为True,即当队列为空时,阻塞当前线程。当为False时,表示当队列为空时,不阻塞线程,而是抛出Empty异常。
timeout:设置阻塞的最大时长,默认为None。
当block为True时,timeout为None,则表示无限期阻塞线程,直到队列里有一个可用元素;timeout为正数,表示阻塞的最大等待时长,如果超出时长队列里还没有元素,则抛出Empty异常。
当block为False时,忽略timeout参数。
6. put(item, block=True, timeout=None)
在队尾添加一个元素。put()有三个参数,依次介绍如下:
item:必需的参数,表示添加元素的值;
block:可选参数,默认值为True,表示当队列已满时阻塞当前线程。如果取值为False,则当队列已满时抛出Full异常。
timeout:可选参数,默认为None。
当block参数值为True时,timeout表示阻塞的时长,如果timeout为None,表示无限期阻塞线程,直到队列里空出一个数据单元;如果timeout为正数,则表示阻塞的最大等待时长,如果超出最大时长还没有可用数据单元出现,则引发Full异常。
如果block参数为False,则忽略timeout参数。
7. get_nowait()
立即取出一个元素,不等待,相当于get(False)。
8. put_nowait()
立即放入一个元素,不等待,相当于put(item,False)。
9. task_done()
在完成一项工作之后,task_done() 函数向任务已经完成的队列发送一个信号。
10. join()
阻塞当前线程,直到队列里的所有元素都已被处理。