gevent.threadpool -本地线程池

class ThreadPool(maxsize, hub=None)[源代码]

基类:gevent.pool.GroupMappingMixin

本机工作线程池。

这对于CPU密集型函数或那些不与gevent协作的函数非常有用。在线程池中执行的最佳函数是具有单一目的的小函数;理想情况下,它们会释放cpythongil。这些函数是用C语言实现的扩展函数。

它实现与 gevent.pool.Pool ,但使用线程而不是greenlets。

注解

方法 apply_async() 将始终返回一个新的greenlet,完全绕过threadpool。

大多数用户不需要创建此类的实例。相反,请使用已经与gevent的hub关联的线程池:

pool = gevent.get_hub().threadpool
result = pool.spawn(lambda: "Some func").get()

重要

只能从运行其集线器的线程中使用此类的实例。通常这意味着从创建它们的线程开始。使用上面显示的模式可以解决这个问题。

但是,gevent没有提供一种方法,在执行此操作时对不同池中的线程数量进行单个进程范围的限制。建议使用gevent和threadpools的方法是有一个gevent集线器和一个threadpool(这是默认值,不需要做任何额外的工作)。只向线程池(不使用gevent hub的函数)分配最小的阻塞函数。

这个 len 此类的实例数是已排队(未完成)的任务数。

就在任务开始在工作线程中运行之前, threading.setprofile()threading.settrace() 都被咨询过了。其中的任何值都会在任务持续时间内安装在该线程中(使用 sys.setprofile()sys.settrace() ,分别)。(因为工作线程很长,并且比任何给定的任务都持续时间长,所以这种安排允许钩子函数在任务之间更改,但不允许它们看到工作线程本身完成的记账。)

警告

此类的实例只有在有未完成的任务时才为真。

在 1.5a3 版更改: 无证件者 apply_e 函数(自1.1以来已弃用)已被删除。

在 20.12.0 版更改: 在工作线程运行所提供的任务时,在工作线程中安装配置文件和跟踪函数。

apply(func, args=None, kwds=None)

粗等价于 apply() 内置函数,阻塞直到结果准备好并返回。

这个 func通常 ,但不是 总是 ,以允许当前greenlet退出的方式运行(例如,在新greenlet或线程中,取决于实现)。但是,如果当前的greenlet或线程已经是该池生成的线程,则该池可以选择立即运行 func 同步。

注解

已实现,正在尝试使用 Threadpool.apply() 在threadpool(任何threadpool)中生成的另一个函数将导致该函数立即运行。

在 1.1a2 版更改: 现在引发由引发的任何异常 func 而不是扔掉它。

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中同步调用。)

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()[源代码]

等待所有未完成的任务完成。

map(func, iterable)

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

参见

imap()

map_async(func, iterable, callback=None)

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

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

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

将新任务添加到将运行的线程池 func(*args, **kwargs) .

等待直到插槽可用。如有必要,创建新的本机线程。

只能从拥有此对象集线器的本机线程调用它。这是因为创建必要的数据结构来与此线程通信是不安全的,因此集线器不能运行其他东西。另外,确保池大小保持正确只在单个线程中有效。

返回

A gevent.event.AsyncResult .

引发

InvalidThreadUseError -- 如果从其他线程调用。

在 1.5 版更改: 记录螺纹安全要求。

property maxsize

允许的最大工作线程数。

这也是(大约)可以在不阻塞等待的greenlet的情况下排队的任务数的限制。如果这么多任务已经在运行,那么下一个提交任务的greenlet将阻塞等待任务完成。

property size

正在运行的池工作线程数。

设置此属性将添加或删除正在运行的工作线程,最多 maxsize .

最初没有池运行的工作线程,线程是按需创建的,以满足以下并发请求: maxsize 线程。

class ThreadPoolExecutor(*args, **kwargs)[源代码]

基类:concurrent.futures.thread.ThreadPoolExecutor

一个版本 concurrent.futures.ThreadPoolExecutor 它总是使用本机线程,即使线程是猴子补丁。

这个 Future 从该对象返回的对象可以与gevent等待原语一起使用,例如 gevent.wait() .

警告

如果线程是 not 猴子修补了,然后 Future 此对象返回的对象不能保证与 as_completed()wait() . 单独的阻塞方法如 result()exception() 会一直有效。

1.2a1 新版功能: 这是一个临时API。

采用与相同的参数 concurrent.futures.ThreadPoolExecuter ,这在Python版本之间有所不同。

第一个论点总是 max_workers ,要使用的最大线程数。大多数其他论点,虽然被接受,却被忽略了。

kill(wait=True, **kwargs)

清理与执行器关联的资源。

多次调用此方法是安全的。否则,在此方法之后不能调用其他方法。

ARG:
等待:如果为真,则关闭将不会返回,直到所有运行

期货已经执行完毕,执行人使用的资源已经回收。

shutdown(wait=True, **kwargs)[源代码]

清理与执行器关联的资源。

多次调用此方法是安全的。否则,在此方法之后不能调用其他方法。

ARG:
等待:如果为真,则关闭将不会返回,直到所有运行

期货已经执行完毕,执行人使用的资源已经回收。

submit(fn, *args, **kwargs)[源代码]

提交一个可使用给定参数执行的调用。

调度可作为fn执行的调用( ARGS, *kwargs)并返回一个表示可调用文件执行的未来实例。

返回:

表示给定呼叫的未来。

Next page: gevent.time --制造 睡觉 Gevent感知