gevent.threadpool
-本地线程池#
- class ThreadPool(maxsize, hub=None, idle_task_timeout=-1)[源代码]#
基类:
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 版本发生变更: 在工作线程运行所提供的任务时,在工作线程中安装配置文件和跟踪函数。
在 22.08.0 版本发生变更: 添加让空闲线程过期并在以下时间后从池中删除的选项 idle_task_timeout 秒(-1表示无超时)
- 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)#
-
当返回的格林莱特开始运行时, 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()
了解更多详细信息。
- map_async(func, iterable, callback=None)#
map()方法的变种,它返回执行map函数的greenlet对象。
如果指定了回调,则它应该是接受单个参数的可调用的。
- spawn(func, *args, **kwargs)[源代码]#
将新任务添加到将运行的线程池
func(*args, **kwargs)
.等待直到插槽可用。如有必要,创建新的本机线程。
只能从拥有此对象集线器的本机线程调用它。这是因为创建必要的数据结构来与此线程通信是不安全的,因此集线器不能运行其他东西。另外,确保池大小保持正确只在单个线程中有效。
- 返回:
- 抛出:
InvalidThreadUseError -- 如果从其他线程调用。
在 1.5 版本发生变更: 记录螺纹安全要求。
- property maxsize#
允许的最大工作线程数。
这也是(大约)可以在不阻塞等待的greenlet的情况下排队的任务数的限制。如果这么多任务已经在运行,那么下一个提交任务的greenlet将阻塞等待任务完成。
- class ThreadPoolExecutor(*args, **kwargs)[源代码]#
基类:
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:
- 等待:如果为真,则关闭将不会返回,直到所有运行
期货已经执行完毕,执行人使用的资源已经回收。
- Cancel_Futures:如果为True,则关闭将取消所有挂起的
未来。已建成或正在运行的期货不会被取消。