Python mpi4py:具有4个进程死锁的进程通信
我正在写一个程序,它应该在三个不同的进程中为字符串添加字符。如果结果字符串与给定字符串匹配,则具有匹配项的进程应向进程0发送“endflag”。进程0收到“endflag”后,应向所有其他进程(1-3)发送广播并退出。其他进程接收广播,也应退出/停止工作Python mpi4py:具有4个进程死锁的进程通信,python,mpi,mpich,mpi4py,Python,Mpi,Mpich,Mpi4py,我正在写一个程序,它应该在三个不同的进程中为字符串添加字符。如果结果字符串与给定字符串匹配,则具有匹配项的进程应向进程0发送“endflag”。进程0收到“endflag”后,应向所有其他进程(1-3)发送广播并退出。其他进程接收广播,也应退出/停止工作 [...] string_given = "abc" magic_bytes = "0xDEA7C0DE" chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456
[...]
string_given = "abc"
magic_bytes = "0xDEA7C0DE"
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 !?@/\%&.-_:,;*+<>|(){}'
end_all = None
if rank == 0:
while(True):
recv_data = comm.recv(source=MPI.ANY_SOURCE)
print("0.recv: %s" % (recv_data))
if recv_data == magic_bytes:
end_all = magic_bytes
send_data = bcast(end_all, root=0)
sys.exit()
if rank == 1:
min, max = 1, 2
while(True):
for n in xrange(min, max):
for c in itertools.product(chars, repeat=n):
string = ''.join(c)
print("1.string: %s" % (string))
if string == string_given:
print("1.found: %s = %s" % (string, string_given))
end_all = magic_bytes
comm.send(end_all, dest=0)
recv_data = comm.bcast(end_all, root=0)
if recv_data == magic_bytes:
sys.exit()
if rank == 2:
min, max = 3, 4
while(True):
for n in xrange(min, max):
for c in itertools.product(chars, repeat=n):
string = ''.join(c)
print("2.string: %s" % (string))
if string == string_given:
print("2.found: %s = %s" % (string, string_given))
end_all = magic_bytes
comm.isend(end_all, dest=0)
recv_data = comm.bcast(end_all, root=0)
if recv_data == magic_bytes:
sys.exit()
[...]
然后我想它会死锁。
如何防止代码死锁?请添加错误消息,并尽可能缩短代码以提高可读性。在代码死锁时添加错误消息?这可能需要一段时间:)没有可用的错误消息,它显示了上面的输出,然后什么也没有发生。。。即使几分钟后。实际上,它应该在几秒钟内生成更多的字符串。当接收到魔法字节时,只将0列为
MPI\u Bcast()
,而其他列总是MPI\u Bcast()
,如果没有找到字符串,则挂起。您可能需要考虑<代码> MPIYBCAST()/<代码>和<代码> MPIyTestTo()/<代码>。Gilles Gouaillardetdo您有一个启动点,我可以在这里了解更多关于<代码> MPIyTestTo()/<代码>和<代码> MPIYBCAST()/<代码>?目前我已经解决了os的问题。_exit(0)
在string==string\u给定后退出python和MPI。但我想要一个带有“标志”的适当解决方案。
3.string: aaaaa
1.string: a
2.string: aaa