Python mpi4py:具有4个进程死锁的进程通信

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

我正在写一个程序,它应该在三个不同的进程中为字符串添加字符。如果结果字符串与给定字符串匹配,则具有匹配项的进程应向进程0发送“endflag”。进程0收到“endflag”后,应向所有其他进程(1-3)发送广播并退出。其他进程接收广播,也应退出/停止工作

[...]

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