浅析 Python 中的队列类

浅析 Python 中的队列类Python 中的队列源代码位于 lib queue py 链接 中 在 LIFO 队列中 最近添加的条目是第一个检索到的条目

大家好,欢迎来到IT知识分享网。

Python中的队列源代码位于 lib/queue.py 「链接」中

该queue模块实现了多生产者、多消费者队列。当必须在多个线程之间安全地交换信息时,queue模块特别有用。该Queue模块中的类实现了所有必需的锁定语义。

该模块实现了三种类型的队列,它们仅在检索条目的顺序上有所不同。在FIFO(先进先出) 队列中,最先添加的任务是最先检索的。在 LIFO (后进先出)队列中,最近添加的条目是第一个检索到的条目(像堆栈一样操作)。使用优先级队列,条目保持排序(使用heapq模块),并首先检索最低值的条目。

在内部,这三种队列使用锁来临时阻塞竞争线程;但是,它们并非旨在处理线程内的重入。

此外,该模块实现了一个“简单”的 FIFO队列类型,SimpleQueue它的具体实现提供了额外的保证以换取更小的功能。

该queue模块定义了以下类和异常:

queue.Queue( maxsize = 0 ) Class

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

queue.LifoQueue( maxsize = 0 ) Class

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

queue.PriorityQueue( maxsize = 0 ) Class

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

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

如果数据元素不可比较,则可以将数据包装在一个忽略数据项而只比较优先级编号的类中:

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

queue.SimpleQueue Class

无界FIFO队列的构造函数。简单队列缺少任务跟踪等高级功能。

3.7 版中的新功能。

queue.Empty exception

对空对象调用非阻塞get()(或 get_nowait())时引发异常。Queue

queue.Full exception

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

队列对象

队列对象(Queue、LifoQueue或PriorityQueue)提供下面描述的公共方法。

Queue.qsize( )

返回队列的大致大小。注意,qsize() > 0 不保证后续的 get() 不会阻塞,qsize() < maxsize 也不保证 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)

项目放入队列。如果可选的参数block为 true 并且timeout为 None(默认值),则在必要时阻止,直到空闲槽可用。如果 timeout是一个正数,它最多会阻塞timeoutFull秒,如果在该时间内没有可用的空闲槽,则会引发异常。否则(block为假),如果空闲槽立即可用,则将项目放入队列,否则引发Full异常(在这种情况下忽略超时)。

Queue.put_nowait(item)

相当于。put(item, block=False)

Queue.get(block=True, timeout=None)

从队列中移除并返回一个项目。如果可选的参数block为 true 并且 timeout为None(默认值),则在必要时阻止,直到项目可用。如果timeout是一个正数,它最多会阻塞timeoutEmpty秒,如果在那段时间内没有可用的项目,则会引发异常。否则(为假),如果一个项目立即可用,则返回一个项目,否则引发Empty异常(在这种情况下忽略超时)。

在 POSIX 系统上的 3.0 之前,对于 Windows 上的所有版本,如果 block为 true 且timeout为None,则此操作将进入底层锁的不间断等待。这意味着不会发生异常,特别是 SIGINT 不会触发KeyboardInterrupt.

Queue.get_nowait( )

相当于get(False)。

提供了两种方法来支持跟踪排队的任务是否已被守护进程消费者线程完全处理。

Queue.task_done( )

指示以前排队的任务已完成。由队列消费者线程使用。对于每个get()用于获取任务的调用,后续调用 task_done()都会告诉队列该任务的处理已完成。

如果 ajoin()当前处于阻塞状态,它将在处理完所有项目后恢复(这意味着task_done()已收到对已put()进入队列的每个项目的调用)。

引发ValueErrorif 调用的次数超过队列中放置的项目的次数。

Queue.join( )

阻塞,直到队列中的所有项目都已被获取和处理。

每当将项目添加到队列中时,未完成任务的计数就会增加。task_done()每当消费者线程调用以指示该项目已被检索并且所有工作都已完成时,计数就会下降。当未完成任务的计数降至零时,join()解除阻塞。

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

import threading, queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Turn-on the worker thread. threading.Thread(target=worker, daemon=True).start() # Send thirty task requests to the worker. for item in range(30): q.put(item) # Block until all tasks are done. q.join() print('All work completed') 

简单队列对象

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

SimpleQueue.qsize( )

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

SimpleQueue.empty( )

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

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

项目放入队列。该方法从不阻塞并且总是成功(除了潜在的低级错误,例如未能分配内存)。可选的参数block和timeout将被忽略,仅提供与Queue.put().

CPython 实现细节:此方法有一个可重入的 C 实现。也就是说,一个 put()orget()调用可以被put() 同一线程中的另一个调用中断,而不会死锁或破坏队列内部的内部状态。这使得它适用于__del__方法或weakref回调等析构函数。

SimpleQueue.put_nowait(item)

等效于put(item, block=False), 并且和 Queue.put_nowait() 兼容

SimpleQueue.get(block=True, timeout=None)

从队列中移除并返回一个项目。如果可选的参数block为 true 并且 timeout为None(默认值),则在必要时阻止,直到项目可用。如果timeout是一个正数,它最多会阻塞timeoutEmpty秒,如果在那段时间内没有可用的项目,则会引发异常。否则(为假),如果一个项目立即可用,则返回一个项目,否则引发Empty异常(在这种情况下忽略超时)。

SimpleQueue.get_nowait( )

相当于get(False)。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/94824.html

(0)
上一篇 2024-10-30 11:15
下一篇 2024-10-30 14:45

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信