queue模块实现了四种队列, 即Queue,LifoQueue, PriorityQueue, SimpleQueue.
queue模块对象
class.queue.Queue(maxsize=0): FIFO队列, 先进先出
class.queue.LifoQueue(maxsize=0):LIFO队列,先进后出,即栈
class.queue.PriorityQueue(maxsize=0):优先队列
设优先队列的元素为item,则优先队列输出值时,item是按【 sorted(list(entries))[0] 】先进行排序,再将最小值优先输出
三个对象的参数maxsize表示该对象的容量,默认为0,即无上限,同时如果为负数也表无上限,当三个对象已满时,再向其传入值时,会引起_queue.Full错误。
常用方法
注:以下是Queue,LifoQueue, PriorityQueue这三个的常用方法,SimpleQueue的方法与其有些相似,可以参考官方文档
-
qsize():返回当前队列的大小
-
empty():判断目前队列是否为空队列,返回布尔值
-
full():判断当前队列是否已满
-
put(item, block=True, timeout=None):向当前队列插入元素item,
- 如果队列已满,且block为True时,则在timeout秒数内阻塞,等待插入;当block为False或等待超过timeout时,抛出queue.Full异常。
- 如果队列已满,block为True,且timeout为None时,程序会一直阻塞直至成功插入元素。 -
put_nowait():相当于put(item, False)
-
get(block=True, timeout=None):从队列中取出一个元素
- 如果队列为空,且block为True时,则在timeout秒数内阻塞,等待获取;当block为False或等待超过timeout时,抛出queue.Empty异常。
- 如果队列为空,block为True,且timeout为None时,程序会一直阻塞直至成功获取下一个元素。 -
get_nowait():相当于get(False)
-
task_done():
- 表示前面排队的任务已经被完成。每个 get() 被用于获取一个任务, 后续调用 task_done() 告诉队列,该任务的处理已经完成。(简单地说就是告诉队列的消费者线程,前面的任务已完成,可以进行下个任务)
- 如果 join() 当前正在阻塞,在所有条目都被处理后,将解除阻塞(意味着每个 put() 进队列的条目的 task_done() 都被收到)。 -
join():阻塞队列, 直到队列中所有的任务都被接收和处理完毕。与task_done()一起配合使用