Queue
Queue — A synchronized queue class
注释
该Queue
模块已被重命名为queue
Python 3. 当将源代码转换为Python 3时,2to3工具将自动适应导入。
源代码:
Lib / Queue.py
该Queue
模块实现了多生产者,多用户队列。当信息必须在多个线程之间安全地交换时,它在线程编程中特别有用。该Queue
模块中的类实现了所有必需的锁定语义。这取决于Python中线程支持的可用性; 看threading
模块。
该模块实现三种类型的队列,它们仅在检索条目的顺序上有所不同。在FIFO队列中,添加的第一个任务是第一个检索的。在LIFO队列中,最近添加的条目是第一个检索到的(像堆栈一样操作)。使用优先级队列,条目保持排序(使用heapq
模块),并且首先检索最低值的条目。
该Queue
模块定义了以下类和例外:
class Queue.Queue(maxsize=0)
FIFO队列的构造器。maxsize
是一个整数,用于设置可以放入队列中的项目数的上限。一旦达到此大小,插入将会阻塞,直到消耗队列项目。如果maxsize
小于或等于零,则队列大小是无限的。
class Queue.LifoQueue(maxsize=0)
LIFO队列的构造器。maxsize
是一个整数,用于设置可以放入队列中的项目数的上限。一旦达到此大小,插入将会阻塞,直到消耗队列项目。如果maxsize
小于或等于零,则队列大小是无限的。
2.6版本中的新功能。
class Queue.PriorityQueue(maxsize=0)
优先队列的构造函数。maxsize
是一个整数,用于设置可以放入队列中的项目数的上限。一旦达到此大小,插入将会阻塞,直到消耗队列项目。如果maxsize
小于或等于零,则队列大小是无限的。
最低值的条目首先被检索(最低值的条目是返回的条目sorted(list(entries))[0]
)。条目的典型模式是以下形式的元组:(priority_number, data)
。
2.6版本中的新功能。
exception Queue.Empty
在空对象上调用非阻塞get()
(或get_nowait()
)时引发异常Queue
。
exception Queue.Full
在对象已满时调用非阻塞put()
(或put_nowait()
)时引发异常Queue
。
1.队列对象
队列对象(Queue
,LifoQueue
或PriorityQueue
)提供下面描述的公共方法。
Queue.qsize()
返回队列的近似大小。请注意,qsize()> 0并不保证后续的get()不会被阻塞,也不会保证put()不会阻塞qsize()<maxsize。
Queue.empty()
True
如果队列为空False
则返回,否则返回。如果empty()返回True
它并不能保证后续的put()调用不会被阻塞。同样,如果empty()返回False
它并不能保证后续调用get()不会被阻塞。
Queue.full()
True
如果队列已满False
则返回,否则返回。如果full()返回True
它并不能保证后续调用get()不会被阻塞。同样,如果full()返回False
它并不能保证后续调用put()不会被阻塞。
Queue.put(item[, block[, timeout]])
将项目
放入队列中。如果可选参数块
为真并且超时
为None
(默认),则在需要时禁止,直到有空闲插槽可用。如果超时
是一个正数,它会阻止至多超时
秒数,并Full
在该时间内没有空闲插槽时引发异常。否则(块
为假),如果空闲插槽立即可用,则在队列中放置一个项目
,否则引发Full
异常(在这种情况下超时
被忽略)。
2.3版本中的新功能:超时
参数。
Queue.put_nowait(item)
相当于put(item, False)
。
Queue.get([block[, timeout]])
从队列中移除并返回一个项目。如果可选的参数块
为true并且超时
为None
(默认),则在必要时阻塞,直到项目可用。如果超时时间
为正数,则最多会阻止超时
秒数,Empty
如果在该时间内没有可用项目,则会引发异常。否则(block
为false),如果一个立即可用,则返回一个项目,否则引发Empty
异常(在这种情况下超时
被忽略)。
2.3版本中的新功能:超时
参数。
Queue.get_nowait()
相当于get(False)
。
提供了两种方法来支持跟踪入队任务是否已完全由守护进程消费者线程处理。
Queue.task_done()
表明以前排队的任务已完成。由队列消费者线程使用。对于每个get()
用于获取任务的对象,后续调用会task_done()
告知队列该任务的处理已完成。
如果join()
当前处于阻塞状态,则在所有项目都处理完毕后(即task_done()
接收到已put()
进入队列的每个项目的呼叫),它将恢复。
提出了一个ValueError
好象叫更多的时间比中放入队列中的项目。
2.5版本中的新功能。
Queue.join()
阻塞,直到队列中的所有项目都被获取并处理。
每当将项目添加到队列中时,未完成任务的数量就会增加。无论何时消费者线程调用task_done()
以指示该项目已被检索并且所有工作都已完成,计数就会减少。当未完成任务的计数降至零时,join()
取消阻止。
2.5版本中的新功能。
如何等待入队任务完成的示例:
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