gevent.queue
--同步队列#
同步队列。
这个 gevent.queue
模块实现跨greenlet工作的多生产者、多消费者队列,API类似于标准中的类。 Queue
和 multiprocessing
模块。
这个模块中的类实现了迭代器协议。迭代队列意味着重复调用 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
将发布此参数。
- class JoinableQueue(maxsize=None, items=(), unfinished_tasks=None)[源代码]#
基类:
Queue
一个子类
Queue
另外还有task_done()
和join()
方法。在 1.1a1 版本发生变更: 如果 unfinished_tasks 没有给出,那么所有给出的 项目 (如有)将被视为未完成。
- 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 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 版本发生变更: 在呼叫时阻止的多个greenlet
put()
因为一个完整的队列现在将被唤醒,按照它们到达的顺序将它们的项目放入队列中。同样,多个绿色小菜在呼叫时阻塞get()
对于空队列,现在将按阻止顺序接收项目。CPython下的一个实现怪癖 通常 确保这基本上是以前的情况,但这不是皮比的情况。- get(block=True, timeout=None)[源代码]#
从队列中移除并返回项目。
如果可选参数 块 是真的 超时 是
None
(默认),必要时阻止,直到项目可用。如果 超时 是正数,最多阻塞 超时 秒,然后提高Empty
如果在该时间内没有可用的项目,则为例外。否则( 块 如果一项立即可用,则返回该项,否则将引发Empty
例外(例外) 超时 在这种情况下被忽略)。
- next()#
- peek(block=True, timeout=None)[源代码]#
从队列返回一个项目而不删除它。
如果可选参数 块 是真的 超时 是
None
(默认),必要时阻止,直到项目可用。如果 超时 是正数,最多阻塞 超时 秒,然后提高Empty
如果在该时间内没有可用的项目,则为例外。否则( 块 如果一项立即可用,则返回该项,否则将引发Empty
例外(例外) 超时 在这种情况下被忽略)。
- put(item, block=True, timeout=None)[源代码]#
将项目放入队列。
如果可选参数 块 是真的 超时 是
None
(默认),必要时阻止,直到可用插槽。如果 超时 是正数,最多阻塞 超时 秒,然后提高Full
如果在此时间内没有可用插槽,则为例外。否则( 块 如果可用插槽立即可用,则将项目放入队列,否则引发Full
例外(例外) 超时 在这种情况下被忽略)。
- getters#
- hub#
- property maxsize#
- putters#
- queue#
- SimpleQueue#
_PySimpleQueue
的别名
- 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