gevent.pool
--管理团队中的绿叶小树#
- class Group(*args)[源代码]#
基类:
GroupMappingMixin
维持一组仍在运行的绿叶树,而不限制它们的数量。
链接到每个项目,并在通知时将其删除。
可以对组进行迭代,以发现它们正在跟踪什么greenlet,可以测试它们是否包含greenlet,并知道它们正在跟踪的greenlet的数量(len)。如果它们不跟踪任何greenlet,那么在布尔上下文中它们是假的。
- greenlet_class#
要么
gevent.Greenlet
(默认)或子类。这些是我们将要使用的对象类型spawn()
. 这可以在实例或子类中更改。
- greenlet_class#
Greenlet
的别名
- add(greenlet)[源代码]#
开始跟踪 格林莱特 .
如果这个组是
full()
,则此方法可能会阻塞,直到可以跟踪greenlet。通常是 格林莱特 应该 not 在添加时启动,因为如果此对象在此方法中阻塞,则 格林莱特 可以在跟踪前运行到完成。
- apply(func, args=None, kwds=None)#
粗等价的
apply()
内置函数阻塞,直到结果准备好并返回。这个
func
将 通常 ,但不是 总是 ,以允许当前greenlet退出的方式运行(例如,在新greenlet或线程中,取决于实现)。但是,如果当前的greenlet或线程已经是该池生成的线程,则该池可以选择立即运行func
同步。任何例外情况
func
引发将传播到的调用方apply
(即,此方法将引发以下异常:func
凸起)。
- apply_async(func, args=None, kwds=None, callback=None)#
-
当返回的格林莱特开始运行时, will 调用
apply()
,传球 func , args 和 kwds .如果 回调 指定了,则它应该是接受单个参数的可调用文件。当结果变为就绪时,将对其应用回调(除非调用失败)。
即使此组已满,此方法也不会阻塞(即,即使
spawn()
会阻塞,此方法不会)。小心
作为该组的一部分,可能会跟踪或不跟踪返回的greenlet,因此
joining
这个组不是等待结果可用或等待返回的greenlet运行的可靠方法;而是加入返回的greenlet。小技巧
因为
ThreadPool
对象不跟踪greenlet,返回的greenlet将永远不会是其中的一部分。为了减少开销和提高性能,Group
和Pool
可以选择跟踪返回的greenlet。这些是可能更改的实现细节。
- apply_cb(func, args=None, kwds=None, callback=None)#
apply()
给定的 func(* ARGS, * * KWDS) *,如果是 回调 给定,运行结果为 func*(除非引发异常。)这个 回调 可以同步或异步调用。如果异步调用,则此组不会跟踪它。 (
Group
和Pool
在新的greenlet中异步调用它;ThreadPool
在当前greenlet中同步调用。)
- imap(func, *iterables, maxsize=None) iterable #
相当于
itertools.imap()
,并联运行。这个 func 应用于从中的每个iterable生成的每个元素 迭代函数 反过来,收集结果。如果此对象绑定了活动greenlet的数量,则它可以包含(例如
Pool
,则最多该数量的任务将并行操作。- 参数:
maxsize (int) -- 如果给定而不是无,则指定等待读卡器时允许累积的已完成结果的最大数量;超过该数量的结果将导致映射函数greenlet开始阻塞。如果在映射代码的速度和使用者之间存在很大的差异,并且结果消耗了大量的资源,那么这是最有用的。…注意:这与活动并行任务数量上的任何绑定都是分开的,尽管它们可能有一些交互作用(例如,将并行任务数量限制为最小绑定)。…注意:使用绑定比不使用绑定的计算开销稍高。…提示:
imap_unordered()
方法可以更好地使用此参数。一些额外的、未指定的对象数量可能需要保存在内存中,以维持此函数的顺序。- 返回:
无法识别的对象。
在 1.1b3 版本发生变更: 增加了 最大尺寸 关键字参数。
在 1.1a1 版本发生变更: 接受多个 迭代函数 并行迭代。
- imap_unordered(func, *iterables, maxsize=None) iterable #
一样
imap()
除了返回的迭代器的结果的顺序应该以任意顺序考虑之外。这个比
imap()
如果订单无关紧要,则应优先考虑。参见
imap()
了解更多详细信息。
- join(timeout=None, raise_error=False)[源代码]#
等待此组变为空 至少一次 .
如果组中没有绿叶,则立即返回。
备注
等到等待代码(此方法的调用方)重新获得控制权时,可能已经向该组添加了一个greenlet,因此该对象可能不再为空。(也就是说,
group.join(); assert len(group) == 0
不保证保持。)此方法只保证组达到len
在某一点上为0。- 参数:
raise_error (bool) -- 如果为真( not 默认值),如果在联接过程中完成的任何greenlet引发了异常,则该异常将引发到此方法的调用方。如果多个greenlet引发了异常,则无法确定会重新引发哪个异常。只有当调用此方法时组中当前的greenlet才会被保证检查异常。
- 返回布尔值:
指示此组是否为空的值。如果指定了超时,并且在超时期间组没有变为空,那么这将是一个错误的值。否则它将是一个真值。
在 1.2a1 版本发生变更: 添加返回值。
- killone(greenlet, exception=<class 'greenlet.GreenletExit'>, block=True, timeout=None)[源代码]#
如果给定 格林莱特 正在运行并被此组跟踪,杀了它。
- map_async(func, iterable, callback=None)#
map()方法的变种,它返回执行map函数的greenlet对象。
如果指定了回调,则它应该是接受单个参数的可调用的。
- spawn(*args, **kwargs)[源代码]#
用给定的参数(传递给greenlet构造函数)开始一个新greenlet,并将其添加到该组正在监视的greenlet集合中。
- 返回:
新开的格林莱特。
- class Pool(size=None, greenlet_class=None)[源代码]#
基类:
Group
创建新池。
池类似于一个组,但成员的最大数目由 size 参数。
- 参数:
size (int) -- 如果给定,此非负整数是此池中允许的活动greenlet的最大计数。一些值具有特殊意义: *
None
(the default) places no limit on the number of greenlets. This is useful when you want to track, but not limit, greenlets. In general, aGroup
may be a more efficient way to achieve the same effect, but some things need the additional abilities of this class (one example being the * 产卵 * parameter ofgevent.baseserver.BaseServer
and its subclassgevent.pywsgi.WSGIServer
). *0
创建一个永远不能有任何活动的greenlet的池。尝试在此池中生成将永远阻塞。只有当应用程序使用wait_available()
超时并检查free_count()
在尝试产卵之前。
- add(greenlet, blocking=True, timeout=None)[源代码]#
开始跟踪给定的 未启动 格林莱特,可能会封锁直到空间可用。
通常你应该打电话
start()
跟踪并启动greenlet,而不是使用这种低级方法,或spawn()
也可以创建绿色小公寓。- 参数:
- 抛出:
PoolFull -- 如果任一
blocking
是假的,池已满,或者blocking
是真的,而且timeout
已超过。
小心
如果 格林莱特 已经启动,并且 舞台调度 是真的,当当前的greenlet块等待跟踪时,greenlet可能运行到完成。这将启用比预期更高的并发性。
参见
在 1.3.0 版本发生变更: 增加了
blocking
和timeout
参数。