下面的一个简单脚本将显示 Popen 在循环中仅发送“ECHO”的最简单情况下仅在第一次迭代中有效(在具有 RHEL 5 的 IBM iDataplex x86 系统上运行)。第一次迭代它可以毫无问题地多次调用 Popen,但之后只有 4 个进程可以访问 Popen。因此,如果有一个调用需要将信息传递给所有进程(例如,allgather 所以需要一个屏障),那么除了 4 个进程之外的所有进程都没有传递任何内容,因为 stdo=''(空字符串)。如果使用 while 循环,则它永远不会退出,因为除了 4 个进程之外的所有进程都陷入了循环。这是该系统特有的还是这里的任何人都知道这是怎么回事?
如果在 4 个或更少的进程上运行,它完全可以正常工作。
from mpi4py import MPI
from subprocess import Popen, PIPE
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
num_proc = comm.Get_size()
if rank == 0:
start_time = MPI.Wtime()
for i in range(10):
stdo = ''
cmd = ['echo','HELLO']
# while stdo == '':
a = Popen(cmd, shell=False, stdout=PIPE, stdin=PIPE)
stdo, stder = a.communicate("Input")
a.wait()
if stdo != "HELLO\n":
print "Rank", rank, "ITER: ", i, "OUT: ", stdo
# comm.barrier()
# r = comm.allgather(stdo) #Causes infinite loop because any number above 4 processors after the first iteration will never exit the while loop
#if any collective operation or barrier is removed, it will work properly
if rank == 0:
print "Num Proc is", num_proc, "Time is", MPI.Wtime() - start_time