queue– 同步队列

源代码: Lib / queue.py


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

该模块实现了三种类型的队列,它们的不同之处仅在于检索条目的顺序。在FIFO 队列中,添加的第一个任务是第一个检索到的任务。在aLIFO 队列,最近添加的条目是第一个检索的(像堆栈一样操作)。使用优先级队列,条目保持排序(使用heapq模块)和最低价值的条目首先被检索.

在内部,这三种类型的队列使用锁来临时阻止竞争线程;但是,它们并不是设计用于处理线程中的重入性

另外,该模块实现了一个“简单”的FIFO 队列类型,SimpleQueue,具体实现为更小的功能提供了额外的保证.

queue module定义以下类和异常:

class queue.Queuemaxsize=0

FIFO 队列的构造函数。maxsize是一个整数,用于设置可以放入队列的项目数的上限。一旦达到此大小,插入将阻塞,直到消耗队列项。如果maxsize小于或等于零,队列大小是无限的.

class queue.LifoQueue(maxsize=0)

LIFO的构造者 queue。maxsize是一个整数,用于设置可以放入队列的项目数的上限。一旦达到此大小,插入将阻塞,直到消耗队列项。如果maxsize小于或等于零,则队列大小为无限.

class queue.PriorityQueuemaxsize=0)

优先级队列的构造函数。maxsize是一个整数,用于设置可以放入队列的项目数的上限。一旦达到此大小,插入将阻塞,直到消耗队列项。如果maxsize小于或等于零,队列大小是无限的.

首先检索最低值的条目(最低值的条目是sorted(list(entries))[0])。条目的典型模式是形式的元组:(priority_number, data).

如果data元素不具有可比性,数据可以包含在一个忽略数据项的clas中,只比较优先级数:

from dataclasses import dataclass, fieldfrom typing import Any@dataclass(order=True)class PrioritizedItem:    priority: int    item: Any=field(compare=False)
class queue.SimpleQueue

无界FIFO的构造函数queue.Simple队列缺少任务跟踪等高级功能.

版本3.7.

exception queue.Empty

非阻塞时引发异常get()(或get_nowait())被称为Queue对象是空的.

exception queue.Full

当非阻塞put()(或put_nowait())被调用Queue对象已满时引发异常

Queue Objects

队列对象(Queue, LifoQueuePriorityQueue)提供下面描述的公共方法.

Queue.qsize

返回队列的大致大小。注意,qsize()>0不保证后续的get()不会阻塞,也不会阻止qsize()<maxsizeguarantee put()不会阻止

Queue.empty

如果队列为空则返回True,否则False。如果empty()返回True,则不保证对put()的后续调用不会阻塞。同样,如果empty()返回False它不保证随后对get()的调用不会阻止

Queue.full

返回True如果队列已满,False除此以外。如果full()返回True它不保证后续调用get()不会阻塞。同样,如果full()返回False,则不保证后续调用put()不会阻塞.

Queue.put (item, block=True, timeout=None

Putitem进入队列。如果可选的args block为true且timeoutNone(默认值),则在必要时阻塞,直到有空闲插槽可用。如果timeout是一个正数,它最多阻塞timeout秒并且如果在那段时间内没有可用的空闲插槽则提高Full异常。否则(block为假),放一个项目如果一个空闲的插槽可以立即使用在队列中,否则提高Full异常(在这种情况下timeout被忽略).

Queue.put_nowaititem

相当于put(item, False).

Queue.getblock=True, timeout=None

从队列中删除并返回一个项目。如果可选的args block为真且timeoutNone(默认值),则必要时阻止直到某个项目可用。如果timeout是正数,它最多会阻塞timeout秒并且如果在那段时间内没有可用的项目则会提取Empty异常。否则(block为假),如果一个项目立即可用则返回一个项目,否则提高Empty异常(timeout在这种情况下被忽略).

Queue.get_nowait

相当于get(False).

提供了两种方法来支持跟踪守护进程任务是否被守护进程消费者线程处理掉了

Queue.task_done// (

表示以前排队的任务已完成。由queue consumethreads使用。对于每个get()用于获取任务,随后调用task_done()告诉队列任务处理完成.

如果join()当前正在阻止,它将在所有项目都被处理后恢复(意味着task_done()对于put()进入队列的每个项目都收到了呼叫.

如果被叫的次数超过队列中放置的项目,则调出ValueError.

Queue.join

阻止,直到队列中的所有项目都被获取并处理完毕.

每当一个项目被添加到队列时,未完成任务的数量就会增加。只要消费者线程调用task_done()表明该项目已被检索,并且所有工作都已完成。当未完成任务的数量下降到零时,join() unblocks.

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

def worker():    while True:        item = q.get()        if item is None:            break        do_work(item)        q.task_done()q = queue.Queue()threads = []for i in range(num_worker_threads):    t = threading.Thread(target=worker)    t.start()    threads.append(t)for item in source():    q.put(item)# block until all tasks are doneq.join()# stop workersfor i in range(num_worker_threads):    q.put(None)for t in threads:    t.join()

SimpleQueue Objects

SimpleQueue对象提供下面描述的公共方法.

SimpleQueue.qsize ( )

返回队列的大致大小。注意,qsize()>0不保证随后的get()不会阻塞.

SimpleQueue.empty)

如果队列是空的,请回复TrueFalse除此以外。如果empty()返回False,则不能保证后续调用get()不会阻塞.

SimpleQueue.put (item, block=True, timeout=None )

Put item进入队列。该方法永远不会阻塞并且总是成功(除了潜在的低级错误,例如无法分配内存)。可选的args blocktimeout被忽略并仅提供与Queue.put().

CPython实现细节的兼容性:此方法具有可重入的C实现。那就是put()get()调用可以被另一个调用put()在同一个线程中调用而不会死锁或破坏队列中的内部状态。这使得适合使用诸如__del__方法或weakref callbacks.

SimpleQueue.put_nowait (item)

等于put(item),与Queue.put_nowait().

SimpleQueue.get兼容(block=True, timeout=None

从队列中删除并返回一个项目。如果可选的args block为真且timeoutNone(默认值),则必要时阻止直到某个项目可用。如果timeout是正数,它最多会阻塞timeout秒并且如果在那段时间内没有可用的项目则会提取Empty异常。否则(block为假),如果一个项目立即可用则返回一个项目,否则提高Empty异常(timeout在这种情况下被忽略).

SimpleQueue.get_nowait

相当于get(False).

另见

multiprocessing.Queue
用于多处理(而不是多线程)上下文的队列类.

collections.deque是无条件的替代实现快速原子append()popleft()不需要锁定的操作

评论被关闭。