在上一篇中我们介绍了 mpi4py 中的 futures 模块,下面我们将介绍 mpi4py 中的 run 模块。
在 mpi4py初始化和运行时设置中介绍过,默认情况下,在导入模块时,mpi4py 会调用 MPI_Init_thread() 以初始化 MPI 执行环境并设置退出钩子以使程序退出前会自动调用 MPI_Finalize() 结束 MPI 执行环境。此外,mpi4py 还重载了默认的 MPI.ERRORS_ARE_FATAL 错误处理函数,将其设置为 MPI.ERRORS_RETURN 以传递 MPI 错误成 Python 的相关异常。这些偏离 MPI 标准的行为对 Python 这样的高动态编程语言是合适的和方便的。使用 mpi4py 时只需一句简单的 from mpi4py import MPI 即可调用 MPI 相关功能而无需冗长而模式化的初始化和结束处理。同时,在调用 MPI 过程中发生的错误,只要其传递成了 Python 异常,就可以使用 Python 中的 try … except … finally 语句进行异常捕获及处理,没有被处理的那些异常会打印调用栈信息以帮助定位有问题的程序代码。
不幸的是,自动的 MPI 初始化和未处理的异常可能会导致死锁,比如说下面这段 Python 代码,假定这段代码是存储在标准的 Python 脚本文件中并且使用 mpiexec 运行(使用 2 个或 2个以上进程)。