在mpi4py中,你可以使用MPI.COMM_WORLD.bcast(), MPI.COMM_WORLD.scatter() 和 MPI.COMM_WORLD.gather() 等方法来调度不同的进程去运行另一个程序,并获取结果。
以下是一个简单的例子,假设我们有一个名为worker.py的程序,它接受一个数字作为参数,并返回该数字的平方:
# worker.py
import sys
def main():
number = int(sys.argv[1])
result = number ** 2
print(result)
if __name__ == "__main__":
main()
现在,我们使用mpi4py在不同的进程中调用这个程序并获取结果:
# mpi_master.py
from mpi4py import MPI
import subprocess
comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()
# 主进程的工作
if rank == 0:
# 假设我们有3个进程可用
numbers_to_compute = [1, 2, 3]
# 分散任务到其他进程
for i in range(size):
subprocess.run(['python', 'worker.py', str(numbers_to_compute[i])])
# 其他进程的工作
else:
# 接收分配给它的任务
number = comm.scatter(numbers_to_compute, root=0)
# 运行worker程序
subprocess.run(['python', 'worker.py', str(number)])
# 收集结果(如果有的话)
result = number ** 2
comm.gather(result, root=0)
在这个例子中,我们假设有3个可用的进程。主进程(rank为0的进程)负责分配任务,而其他进程负责执行这些任务。每个工作进程使用subprocess.run()来运行worker.py脚本。
请注意,这只是一个简化的例子,实际使用时你可能需要处理更多的错误和异常情况,并且可能需要更复杂的同步和通信机制来确保进程之间正确地执行和数据收集。