学科分类
目录
网络爬虫

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()

阻塞当前线程,直到队列里的所有元素都已被处理。

点击此处
隐藏目录