– 同步队列类 – 并发执行(Python教程)(参考资料)
queue– 同步队列类
源代码: Lib / queue.py
queue模块实现了多生产者,多用户队列。当在多个线程之间必须安全地交换信息时,它在线程编程中特别有用。Queuethismodule中的类实现了所有必需的锁定语义。这取决于Python中线程支持的可用性;看threading模块
该模块实现了三种类型的队列,它们的不同之处仅在于检索条目的顺序。在FIFO 队列中,添加的第一个任务是第一个检索到的任务。在aLIFO 队列,最近添加的条目是第一个检索的(像堆栈一样操作)。使用优先级队列,条目保持排序(使用heapq模块)和最低价值的条目首先被检索.
在内部,这三种类型的队列使用锁来临时阻止竞争线程;但是,它们并不是设计用于处理线程中的重入性
另外,该模块实现了一个“简单”的FIFO 队列类型,SimpleQueue,具体实现为更小的功能提供了额外的保证.
queue module定义以下类和异常:
- class
queue.Queue(maxsize=0) -
FIFO 队列的构造函数。maxsize是一个整数,用于设置可以放入队列的项目数的上限。一旦达到此大小,插入将阻塞,直到消耗队列项。如果maxsize小于或等于零,队列大小是无限的.
- class
queue.LifoQueue(maxsize=0) -
LIFO的构造者 queue。maxsize是一个整数,用于设置可以放入队列的项目数的上限。一旦达到此大小,插入将阻塞,直到消耗队列项。如果maxsize小于或等于零,则队列大小为无限.
- class
queue.PriorityQueue(maxsize=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.
Queue Objects
队列对象(Queue, LifoQueue或PriorityQueue)提供下面描述的公共方法.
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且timeout是
None(默认值),则在必要时阻塞,直到有空闲插槽可用。如果timeout是一个正数,它最多阻塞timeout秒并且如果在那段时间内没有可用的空闲插槽则提高Full异常。否则(block为假),放一个项目如果一个空闲的插槽可以立即使用在队列中,否则提高Full异常(在这种情况下timeout被忽略).
Queue.get(block=True, timeout=None)-
从队列中删除并返回一个项目。如果可选的args block为真且timeout是
None(默认值),则必要时阻止直到某个项目可用。如果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.put(item, block=True, timeout=None )-
Put item进入队列。该方法永远不会阻塞并且总是成功(除了潜在的低级错误,例如无法分配内存)。可选的args block和timeout被忽略并仅提供与
Queue.put().
SimpleQueue.get兼容(block=True, timeout=None)-
从队列中删除并返回一个项目。如果可选的args block为真且timeout是
None(默认值),则必要时阻止直到某个项目可用。如果timeout是正数,它最多会阻塞timeout秒并且如果在那段时间内没有可用的项目则会提取Empty异常。否则(block为假),如果一个项目立即可用则返回一个项目,否则提高Empty异常(timeout在这种情况下被忽略).
另见
- 类
multiprocessing.Queue - 用于多处理(而不是多线程)上下文的队列类.
collections.deque是无条件的替代实现快速原子append()和popleft()不需要锁定的操作
评论被关闭。