gevent.queue --同步队列#

同步队列。

这个 gevent.queue 模块实现跨greenlet工作的多生产者、多消费者队列,API类似于标准中的类。 Queuemultiprocessing 模块。

这个模块中的类实现了迭代器协议。迭代队列意味着重复调用 get 直到 get 收益率 StopIteration (特别是那个类,不是实例或子类)。

>>> import gevent.queue
>>> queue = gevent.queue.Queue()
>>> queue.put(1)
>>> queue.put(2)
>>> queue.put(StopIteration)
>>> for item in queue:
...    print(item)
1
2

在 1.0 版本发生变更: Queue(0) 现在是无限大的队列,而不是通道。一 DeprecationWarning 将发布此参数。

exception Empty#

基类:Exception

queue.get(block=0)/get_nowait()引发异常。

exception Full[源代码]#

基类:Exception

Queue.Put(block=0)/Put_Nowait()引发异常。

class Channel(maxsize=1)[源代码]#

基类:object

empty()[源代码]#
full()[源代码]#
get(block=True, timeout=None)[源代码]#
get_nowait()[源代码]#
next()#
put(item, block=True, timeout=None)[源代码]#
put_nowait(item)[源代码]#
qsize()[源代码]#
property balance#
getters#
hub#
putters#
class JoinableQueue(maxsize=None, items=(), unfinished_tasks=None)[源代码]#

基类:Queue

一个子类 Queue 另外还有 task_done()join() 方法。

在 1.1a1 版本发生变更: 如果 unfinished_tasks 没有给出,那么所有给出的 项目 (如有)将被视为未完成。

copy()[源代码]#
join(timeout=None)[源代码]#

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

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

参数:

timeout (float) -- 如果没有 None ,然后等待所有任务完成的时间不超过秒。

返回:

True 如果所有任务都已完成;如果 timeout 在所有任务完成之前提供并过期, False .

在 1.1a1 版本发生变更: 添加 超时 参数。

task_done()[源代码]#

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

如果A join() 当前正在阻止,它将在处理完所有项目后恢复(意味着 task_done() 每一件物品都接到了呼叫 put 进入队列)。

提出一个 ValueError 如果调用次数超过了队列中放置的项目数。

unfinished_tasks#
class LifoQueue(maxsize=None, items=(), _warn_depth=2)[源代码]#

基类:Queue

一个子类 Queue 首先检索最近添加的项。

class PriorityQueue(maxsize=None, items=(), _warn_depth=2)[源代码]#

基类:Queue

一个子类 Queue 按优先级(最低优先级优先)检索条目的。

条目通常是形式的元组: (priority number, data) .

在 1.2a1 版本发生变更: 任何 项目 现在将传递给构造函数 heapq.heapify() 以确保此类的不变量保持不变。以前只是假设它们已经是一堆了。

class Queue(maxsize=None, items=(), _warn_depth=2)[源代码]#

基类:object

创建具有给定最大大小的队列对象。

如果 最大尺寸 小于或等于零或 None ,队列大小是无限的。

队列具有 len 等于其中的项数 qsize() ,但在布尔上下文中,它们总是正确的。

在 1.1b3 版本发生变更: 队列现在支持 len() 其行为与 qsize() .

在 1.1b3 版本发生变更: 在呼叫时阻止的多个greenlet put() 因为一个完整的队列现在将被唤醒,按照它们到达的顺序将它们的项目放入队列中。同样,多个绿色小菜在呼叫时阻塞 get() 对于空队列,现在将按阻止顺序接收项目。CPython下的一个实现怪癖 通常 确保这基本上是以前的情况,但这不是皮比的情况。

copy()[源代码]#
empty()[源代码]#

返回 True 如果队列为空, False 否则。

full()[源代码]#

返回 True 如果队列已满, False 否则。

Queue(None) 从不吃饱。

get(block=True, timeout=None)[源代码]#

从队列中移除并返回项目。

如果可选参数 是真的 超时None (默认),必要时阻止,直到项目可用。如果 超时 是正数,最多阻塞 超时 秒,然后提高 Empty 如果在该时间内没有可用的项目,则为例外。否则( 如果一项立即可用,则返回该项,否则将引发 Empty 例外(例外) 超时 在这种情况下被忽略)。

get_nowait()[源代码]#

从队列中移除并返回一个项目而不阻塞。

只有在一个项目立即可用时才能获取该项目。否则升高 Empty 例外。

next()#
peek(block=True, timeout=None)[源代码]#

从队列返回一个项目而不删除它。

如果可选参数 是真的 超时None (默认),必要时阻止,直到项目可用。如果 超时 是正数,最多阻塞 超时 秒,然后提高 Empty 如果在该时间内没有可用的项目,则为例外。否则( 如果一项立即可用,则返回该项,否则将引发 Empty 例外(例外) 超时 在这种情况下被忽略)。

peek_nowait()[源代码]#

从队列返回一个项目而不阻塞。

仅当一个项目立即可用时才返回该项目。否则升高 Empty 例外。

put(item, block=True, timeout=None)[源代码]#

将项目放入队列。

如果可选参数 是真的 超时None (默认),必要时阻止,直到可用插槽。如果 超时 是正数,最多阻塞 超时 秒,然后提高 Full 如果在此时间内没有可用插槽,则为例外。否则( 如果可用插槽立即可用,则将项目放入队列,否则引发 Full 例外(例外) 超时 在这种情况下被忽略)。

put_nowait(item)[源代码]#

将项目放入队列而不阻塞。

仅当可用插槽立即可用时才将项目排队。否则升高 Full 例外。

qsize()[源代码]#

返回队列的大小。

getters#
hub#
property maxsize#
putters#
queue#
SimpleQueue#

_PySimpleQueue 的别名

exception Full[源代码]#

的别名 Queue.Full

exception Empty#

的别名 Queue.Empty

实例#

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

def worker():
    while True:
        item = q.get()
        try:
            do_work(item)
        finally:
            q.task_done()

q = JoinableQueue()
for i in range(num_worker_threads):
     gevent.spawn(worker)

for item in source():
    q.put(item)

q.join()  # block until all tasks are done