concurrent.futures.processpoolexecutor的健壮实现

lok的Python项目详细描述


可重用流程池执行器Build StatusBuild statuscodecov

目标

这个项目的目的是提供一个健壮的、跨平台的 的ProcessPoolExecutor类的跨版本实现 concurrent.futures。它的显著特点是:

  • 一致且健壮的派生行为:所有进程都已启动 在posix系统上使用fork+exec。这确保了与 第三方库。相反,multiprocessing.Pool使用 默认情况下不带exec的fork,导致第三方运行时崩溃 (例如OpenMP、MacOS加速…)。

  • 可重用执行器:避免重新生成完整的 每次都是执行者。单例执行器实例可以重用(并且 如有必要,动态调整大小)跨越连续调用以限制 生成和关闭开销。可以关闭工作进程 在可配置的空闲超时后自动释放系统 资源。

  • 透明cloudpickle集成:以交互方式调用 并行定义函数和lambda表达式它也是 可以注册自定义pickler实现来处理 进程间通信。

  • 脚本中不需要if __name__ == "__main__"::谢谢 使用cloudpickle调用 __main__模块,不需要保护代码调用 windows下的并行函数。

  • 无死锁实现:在 标准的multiprocessingconcurrent.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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
检查java中两个链表之间的子集   java仅在findViewById()下显示一个ImageButton   在Java Graphics2D中,文本如何在矩形上居中对齐?   java需要一个用于电子表格计算器的正则表达式   ^java中的运算符   java通过一些属性配置文件根据环境动态更改wsdl端点URL   java Ebean/Play框架关系未更新   集合如何将POJO列表转换为Java流中的映射<String,List>?   java为什么JFrame不显示整个图像?   java如何将调用静态导入的泛型方法的结果传递给另一个方法?   迭代器或foreach中的java延迟   需要java socket logback日志接收器   在Java中初始化Map的静态数组   雅加达邮件Java MimeMail:解码后获得额外字符   java为什么这个xmldom解析器不能正确解析rtept、name和cmt标记?   java如何刷新Log4J2中的异步记录器(带中断器)   java使用构建插件pom生成的jar。xml作为同一pom中的依赖项   java基于位置的序列ADT如何在O(1)时间内插入元素?   java ORM实体与DDD实体   Java对象分配