concurrent.futures.processpoolexecutor的健壮实现
lok的Python项目详细描述
可重用流程池执行器
目标
这个项目的目的是提供一个健壮的、跨平台的
的ProcessPoolExecutor
类的跨版本实现
concurrent.futures
。它的显著特点是:
一致且健壮的派生行为:所有进程都已启动 在posix系统上使用fork+exec。这确保了与 第三方库。相反,
multiprocessing.Pool
使用 默认情况下不带exec的fork,导致第三方运行时崩溃 (例如OpenMP、MacOS加速…)。可重用执行器:避免重新生成完整的 每次都是执行者。单例执行器实例可以重用(并且 如有必要,动态调整大小)跨越连续调用以限制 生成和关闭开销。可以关闭工作进程 在可配置的空闲超时后自动释放系统 资源。
透明cloudpickle集成:以交互方式调用 并行定义函数和lambda表达式它也是 可以注册自定义pickler实现来处理 进程间通信。
脚本中不需要
if __name__ == "__main__":
:谢谢 使用cloudpickle
调用__main__
模块,不需要保护代码调用 windows下的并行函数。无死锁实现:在 标准的
multiprocessing
和concurrent.futures
模块是Pool/Executor
处理工人崩溃的能力 过程。这个库打算修复那些可能的死锁 发回有意义的错误。注意到concurrent.futures.ProcessPoolExecutor
随Python 3.7提供+ 和洛基的执行者一样强壮,但后者也适用于 旧版本的python。
安装
安装loky
的推荐方法是使用pip
,
pip install loky
loky
也可以使用
python setup.py install
注意,loky
对^{
使用量
importosfromtimeimportsleepfromlokyimportget_reusable_executordefsay_hello(k):pid=os.getpid()print("Hello from {} with arg {}".format(pid,k))sleep(.01)returnpid# Create an executor with 4 worker processes, that will# automatically shutdown after idling for 2sexecutor=get_reusable_executor(max_workers=4,timeout=2)res=executor.submit(say_hello,1)print("Got results:",res.result())results=executor.map(say_hello,range(50))n_workers=len(set(results))print("Number of used processes:",n_workers)assertn_workers==4
有关更多高级用法,请参见我们的documentation
要贡献的工作流
要向loky捐款,请首先在github上创建一个帐户。 完成后,将loky repository分叉到 拥有自己的存储库,在您所在的计算机上使用“git clone”克隆它 想工作。在克隆中进行更改,将其推送到github帐户, 在几台电脑上测试它们,当你对它们满意时,发送一个拉 请求主存储库。
运行测试套件
要运行测试套件,您需要pytest
(version>;=3)和psutil
模块。使用以下命令运行测试套件:
pip install -e . pytest .
从项目的根本上。
确认
这项工作得到了数据科学中心的支持,该中心由idex资助。 巴黎Saclay,ANR-11-IDEX-0003-02