使用mpi4的MPI-python程序py.futures.MPIComExecutor公司()未完成执行

2024-06-28 19:24:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用python编写一个简单的基于mpi的并行程序,使用mpi4py在一些工作进程池中异步分配一些作业,然后在它们全部完成时收集答案。我有以下python程序:

from mpi4py import MPI
from mpi4py.futures import MPICommExecutor
import math

def primefact(n):
     facts = [1]
     if n < 1:
          return []
     while n % 2 == 0: 
          facts.append(2) 
          n = n / 2
     for i in range(3,int(math.sqrt(n))+1,2): 
          while n % i== 0: 
               facts.append(i) 
               n = n / i 
     if n > 2: 
          facts.append(n)
     return facts

def test_primefact(nums):
     with MPICommExecutor(MPI.COMM_WORLD, root=0) as executor:
          if executor is None: 
               return
          jobs = [executor.submit(primefact,qq) for qq in nums]
          facts = [job.result() for job in jobs]
          for rslt in zip(nums,facts):
               print('{}: '.format(rslt[0]) + ', '.join([str(qq) for qq in rslt[1]]))

if __name__ == "__main__":
     nums = [qq for qq in range(1,201)]
     test_primefact(nums)

当我使用命令mpiexec -n 4 ./mpitest.py运行程序时,程序执行将无限期挂起。如果我通过按Ctrl-C发送终止信号,那么程序将打印所有输出(因此它在某个点进行了计算;我不知道它是在我发送终止信号之前还是之后进行了计算),但它不会返回命令提示符。如果我再次发送终止信号,我会得到命令提示符,但mpiexec生成的进程仍将在后台运行,我必须手动杀死它们。我是否遗漏了一行,让mpicomexecutor知道所有事情都已处理完毕,以便可以退出?据我所知,我没有做任何与示例herehere有实质性区别的事情。你知道吗

  • mpi4py 3.0.0版
  • python 3.6版
  • 英特尔(R)MPI库Linux*操作系统2019版更新1内部版本20181016

Tags: inimport程序forreturnifmpi4pyqq