8.10. 队列-同步队列类

Note

Queue模块在 Python 3 中已重命名为queue2to3工具在将源转换为 Python 3 时将自动适应导入。

源代码: Lib/Queue.py


Queue模块实现多生产者,多 Consumer 队列。当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。此模块中的Queue类实现所有必需的锁定语义。这取决于 Python 中线程支持的可用性。参见threading模块。

该模块实现了三种类型的队列,它们的区别仅在于检索条目的 Sequences 不同。在 FIFO 队列中,首先检索到添加的第一个任务。在 LIFO 队列中,最近添加的条目是第一个检索到的条目(操作类似于堆栈)。使用优先级队列,条目将保持排序(使用heapq模块),并首先检索值最低的条目。

Queue模块定义以下类和异常:

2.6 版的新Function。

最低值的条目首先被检索(最低值的条目是sorted(list(entries))[0]返回的条目)。条目的典型模式是(priority_number, data)形式的 Tuples。

2.6 版的新Function。

See also

collections.deque是具有不需要锁定的快速原子append()popleft()操作的无界队列的替代实现。

8.10.1. 队列对象

队列对象(QueueLifoQueuePriorityQueue)提供下面描述的公共方法。

2.3 版中的新Function:* timeout *参数。

2.3 版中的新Function:* timeout *参数。

提供两种方法来支持跟踪排队的任务是否已由守护程序使用者线程完全处理。

如果join()当前正在阻止,它将在处理完所有项目后恢复(这意味着已收到put()的每个项目都收到了task_done()调用)。

如果被调用的次数比队列中放置的项目多,则引发ValueError

2.5 版的新Function。

每当将项目添加到队列时,未完成任务的数量就会增加。每当使用者线程调用task_done()表示已检索到该项目并且该项目的所有工作已完成时,该计数就会减少。当未完成的任务计数降至零时,join()解除阻止。

2.5 版的新Function。

如何 await 排队的任务完成的示例:

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
首页