gevent.pool --管理团队中的绿叶小树#

class Group(*args)[源代码]#

基类:GroupMappingMixin

维持一组仍在运行的绿叶树,而不限制它们的数量。

链接到每个项目,并在通知时将其删除。

可以对组进行迭代,以发现它们正在跟踪什么greenlet,可以测试它们是否包含greenlet,并知道它们正在跟踪的greenlet的数量(len)。如果它们不跟踪任何greenlet,那么在布尔上下文中它们是假的。

greenlet_class#

要么 gevent.Greenlet (默认)或子类。这些是我们将要使用的对象类型 spawn() . 这可以在实例或子类中更改。

__len__()[源代码]#

回答我们跟踪了多少个绿色小菜。注意,如果我们是空的,那么在布尔上下文中我们是假的。

__contains__(item)[源代码]#

如果我们正在跟踪给定的greenlet,请回答。

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)#

的变体 apply() 返回 Greenlet 对象。

当返回的格林莱特开始运行时, will 调用 apply() ,传球 funcargskwds .

如果 回调 指定了,则它应该是接受单个参数的可调用文件。当结果变为就绪时,将对其应用回调(除非调用失败)。

即使此组已满,此方法也不会阻塞(即,即使 spawn() 会阻塞,此方法不会)。

小心

作为该组的一部分,可能会跟踪或不跟踪返回的greenlet,因此 joining 这个组不是等待结果可用或等待返回的greenlet运行的可靠方法;而是加入返回的greenlet。

小技巧

因为 ThreadPool 对象不跟踪greenlet,返回的greenlet将永远不会是其中的一部分。为了减少开销和提高性能, GroupPool 可以选择跟踪返回的greenlet。这些是可能更改的实现细节。

apply_cb(func, args=None, kwds=None, callback=None)#

apply() 给定的 func(* ARGS, * * KWDS) *,如果是 回调 给定,运行结果为 func*(除非引发异常。)

这个 回调 可以同步或异步调用。如果异步调用,则此组不会跟踪它。 (GroupPool 在新的greenlet中异步调用它; ThreadPool 在当前greenlet中同步调用。)

discard(greenlet)[源代码]#

别再跟踪格林莱特了。

full()[源代码]#

返回一个值,该值指示此组是否可以跟踪更多的greenlet。

在这个实现中,由于跟踪的greenlet的数量没有限制,所以这将始终返回 False 价值。

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 版本发生变更: 添加返回值。

kill(exception=<class 'greenlet.GreenletExit'>, block=True, timeout=None)[源代码]#

杀死所有被这个组跟踪的绿小队。

killone(greenlet, exception=<class 'greenlet.GreenletExit'>, block=True, timeout=None)[源代码]#

如果给定 格林莱特 正在运行并被此组跟踪,杀了它。

map(func, iterable)#

返回通过应用 func 到iterable的每个元素。

参见

imap()

map_async(func, iterable, callback=None)#

map()方法的变种,它返回执行map函数的greenlet对象。

如果指定了回调,则它应该是接受单个参数的可调用的。

spawn(*args, **kwargs)[源代码]#

用给定的参数(传递给greenlet构造函数)开始一个新greenlet,并将其添加到该组正在监视的greenlet集合中。

返回:

新开的格林莱特。

start(greenlet)[源代码]#

Add the unstarted greenlet to the collection of greenlets this group is monitoring, and then start it.

wait_available(timeout=None)[源代码]#

阻止,直到可以 spawn() 一个新的绿色小菜。

在这个实现中,因为跟踪的绿信子数量没有限制,所以总是会立即返回。

class PoolFull[源代码]#

基类:Full

当池已满并且试图以非阻塞模式向池中添加新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, a Group 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 of gevent.baseserver.BaseServer and its subclass gevent.pywsgi.WSGIServer). * 0 创建一个永远不能有任何活动的greenlet的池。尝试在此池中生成将永远阻塞。只有当应用程序使用 wait_available() 超时并检查 free_count() 在尝试产卵之前。

add(greenlet, blocking=True, timeout=None)[源代码]#

开始跟踪给定的 未启动 格林莱特,可能会封锁直到空间可用。

通常你应该打电话 start() 跟踪并启动greenlet,而不是使用这种低级方法,或 spawn() 也可以创建绿色小公寓。

参数:
  • blocking (bool) -- 如果为真(默认值),则此函数将一直阻塞,直到池有空间或发生超时。如果为false,则当池当前已满时,此函数将立即引发超时。

  • timeout (float) -- 此方法将阻止的最大秒数,如果 blocking 是真的。(如果忽略 blocking 是假的。)

抛出:

PoolFull -- 如果任一 blocking 是假的,池已满,或者 blocking 是真的,而且 timeout 已超过。

小心

如果 格林莱特 已经启动,并且 舞台调度 是真的,当当前的greenlet块等待跟踪时,greenlet可能运行到完成。这将启用比预期更高的并发性。

参见

Group.add()

在 1.3.0 版本发生变更: 增加了 blockingtimeout 参数。

free_count()[源代码]#

返回一个指示 大约 可以向该池添加多少成员。

full()[源代码]#

返回一个布尔值,指示此池是否已满,例如,如果 add() 会阻塞。

返回:

如果有新成员的空间,则为假;如果没有,则为真。

start(greenlet, blocking=True, timeout=None) None[源代码]#

Add the unstarted greenlet to the collection of greenlets this group is monitoring and then start it.

参数与 add() .

wait_available(timeout=None)[源代码]#

等到有可能在这个池子里产卵。

参数:

timeout (float) -- 如果给定,只等待指定的秒数。

警告

如果池初始化的大小为0,则除非给出超时,否则此方法将永远阻塞。

返回:

一个数字,指示可以在不阻塞的情况下将多少新的绿色小菜放入池中。

在 1.1a3 版本发生变更: 增加了 timeout 参数。