使用mpi4py.futures.MPIComExecutor()的MPI python程序未完成执行

使用mpi4py.futures.MPIComExecutor()的MPI python程序未完成执行,python,mpi,mpi4py,Python,Mpi,Mpi4py,我正在尝试使用mpi4py在python中编写一个简单的基于mpi的并行程序,该程序在一些工作进程池中异步分配一些作业,然后在它们全部完成后收集答案。我有以下python程序: from mpi4py import MPI from mpi4py.futures import MPICommExecutor import math def primefact(n): facts = [1] if n < 1: return [] whil

我正在尝试使用mpi4py在python中编写一个简单的基于mpi的并行程序,该程序在一些工作进程池中异步分配一些作业,然后在它们全部完成后收集答案。我有以下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)
从MPI4p导入MPI
从mpi4py.futures导入MPIComExecutor
输入数学
def primefact(n):
事实=[1]
如果n<1:
返回[]
当n%2==0时:
事实。附加(2)
n=n/2
对于范围(3,int(数学sqrt(n))+1,2)内的i:
当n%i==0时:
事实。附加(i)
n=n/i
如果n>2:
事实。附加(n)
返回事实
def测试(nums):
使用MPIComExecutor(MPI.COMM_WORLD,root=0)作为执行器:
如果执行人为无:
返回
作业=[executor.submit(primefact,qq)用于nums中的qq]
事实=[job.result()表示作业中的作业]
对于zip中的rslt(nums,事实):
打印('{}:'.format(rslt[0])+','.join([str(qq)表示rslt[1]]中的qq)))
如果名称=“\uuuuu main\uuuuuuuu”:
nums=[qq代表范围内的qq(1201)]
测试事实(nums)
当我使用命令
mpiexec-n4./mpitest.py运行程序时,程序执行将无限期挂起。如果我通过按Ctrl-C发送终止信号,程序将打印所有输出(因此它在某个点执行了计算;我不知道它在发送终止信号之前还是之后执行了计算),但它不会返回命令提示符。如果我再次发送终止信号,我将返回命令提示符,但是mpiexec生成的进程仍将在后台运行,我必须手动杀死它们。我是否在某个地方遗漏了一行,让MPIComExecutor知道一切都已处理完毕,因此可以退出?就我所知,我没有做任何与示例和示例有实质性区别的事情

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

对我有效,结果会立即打印出来。您使用的是哪个MPI库的哪个版本?mpi4py的哪个版本?Python的哪个版本?我在帖子中添加了版本信息。我正在使用的MPI库可能有问题,或者在conda环境中尝试这样做可能有问题,因为帖子中链接中的示例也不正常。也许这与我的问题有关?我知道我也会犯同样的错误。我应用了该线程中提到的修复程序,只要线程不必相互通信(例如,只需打印进程排名和退出),它就可以正常运行。只要我引入一个
MPI.COMM\u WORLD.send()
或一个
MPI.COMM\u WORLD.recv()
,程序执行就会挂起。我得到了一个只使用
send()
recv()
函数工作的版本。不过,我仍然无法让
mpicomexecutor
工作。