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