mpi4py 中的 futures 模块

本文从本人简书博客同步过来

上一篇中我们介绍了 mpi4py 中的 profiling,下面我们将介绍 mpi4py 中的 futures 模块。

mpi4py.futures 提供了一个由多个工作进程使用 MPI 进程间通信来异步执行任务的高级别接口。mpi4py.futures 是建立在 Python 标准库中的 concurrent.futures 的基础之上的。这里先简要介绍一下 concurrent.futures 模块。

concurrent.futures

concurrent.futures 提供了一个异步并行执行任务的高级别接口。异步执行的任务可以通过线程来完成(使用 ThreadPoolExecutor),也可以通过不同的进程来完成(使用 ProcessPoolExecutor),它们都继承自抽象的 Executor 类。

为了有助于理解和使用 moi4py.futures,下面简要给出 concurrent.futures 中的主要类,方法和函数,但是不做详细的讲解,想要了解更多的读者可以参见其文档

Executor 类

class concurrent.futures.Executor

提供异步执行任务的抽象类,不能直接使用,而是使用其具体的子类。下面是其几个主要的方法接口:

submit(fn, *args, **kwargs)

提交执行 fn(*args **kwargs),返回一个 Future 对象(将在下面介绍)表示提交执行的结果。

map(func, *iterables, timeout=None, chunksize=1)

类似于 Python 中的 map(func, *iterables),不同的是 func 是异步并发执行的。

shutdown(wait=True)

通知任务执行器在当前挂起的 future 任务完成后释放所占用的资源。

ThreadPoolExecutor 类

ThreadPoolExecutor 是 Executor 的一个子类,使用一个线程池来异步地执行任务,下面是其类原型:

class concurrent.futures.ThreadPoolExecutor(max_workers=None, thread_name_prefix='', initializer=None, initargs=())

ProcessPoolExecutor 类

ProcessPoolExecutor 是 Executor 的一个子类,使用一个进程池来异步地执行任务,使用 multiprocessing 模块,可以避开 Python 的 Global Interpreter Lock (GIL),但是只有那些可以被 pickle 系列化的对象才能被执行并返回。下面是其类原型:

class concurrent.futures.ProcessPoolExecutor(max_workers=None, mp_context=None, initializer=None, initargs=())

Future 对象

Future 类包装异步执行的任务结果。Future 类对象由 Executor.submit() 创建。

class concurrent.futures.Future()

Future 类原型,下面使其主要方法:

cancel()

尝试取消调用。

cancelled()

如果调用被成功取消则返回 True。

running()

如果调用正在执行而不能被取消则返回 True。

done()

如果调用被成功取消或已执行完成则返回 True。

result(timeout=None)

返回调用的结果。

exception(timeout=None)

返回调用抛出的异常。

模块函数

concurrent.futures.wait(fs, timeout=None, return_when=ALL_COMPLETED)

等待 Future 对象 fs 完成。

concurrent.futures.as_completed(fs, timeout=None)

返回一个由一系列 Future 对象中完成(执行完或者被取消)的那些组成的迭代器。

mpi4py.futures

mpi4py.futures 是基于 concurrent.futures 的。具体来说,mpi4py.futures 提供了 Executor 类的子类实现 MPIPoolExecutor 和 MPICommExecutor。

MPIPoolExecutor 类

MPIPoolExecutor 使用一个 MPI 进程池来异步执行任务。同 ProcessPoolExecutor,MPIPoolExecutor 可以避开 Python 的 Global Interpreter Lock (GIL),但是只有那些可以被 pickle 系列化的对象才能被执行并返回。因为工作进程必须导入 __main__ 模块,因此 MPIPoolExecutor 不能工作在交互的环境下(如 Ipython shell 中)。

MPIPoolExecutor 使用 MPI-2 标准中引进的动态进程管理特性。主进程使用 MPI.COMM_SELF 的 Spawn() 方法启动新的工作进程。主进程会分别使用一个单独的线程同每个工作进程进行通信。工作进程在其唯一的主线程内执行所分配到的任务。为了避免工作进程再启动新的工作进程(会导致无限递归),一种简单的方式是将 MPIPoolExecutor 执行代码放到主脚本的 if __name

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值