python中并行运行的一致断言?

python中并行运行的一致断言?,python,parallel-processing,assert,mpi4py,Python,Parallel Processing,Assert,Mpi4py,在我看来,在并行运行的python代码中,至少一个处理器失败的断言应该中止所有处理器,以便: 1) 错误消息清晰可见(带有堆栈跟踪) 2) 剩余的处理器不会一直等待 然而,这不是标准断言所做的 这个问题已经在本节中提出 但我对答案并不满意。这里建议使用comm.Abort()函数,但这只回答了上面的第2)点 所以我想知道:对于并行代码(例如mpi4py)是否有一个标准的“assert”函数,或者我是否应该为此编写自己的assert 谢谢 编辑——这是我的尝试(在课堂上,但也可以在课堂外),当然可

在我看来,在并行运行的python代码中,至少一个处理器失败的断言应该中止所有处理器,以便:

1) 错误消息清晰可见(带有堆栈跟踪)

2) 剩余的处理器不会一直等待

然而,这不是标准断言所做的

这个问题已经在本节中提出 但我对答案并不满意。这里建议使用comm.Abort()函数,但这只回答了上面的第2)点

所以我想知道:对于并行代码(例如mpi4py)是否有一个标准的“assert”函数,或者我是否应该为此编写自己的assert

谢谢

编辑——这是我的尝试(在课堂上,但也可以在课堂外),当然可以改进:

import mpi4py.MPI as mpi
import traceback

class My_code():

    def __init__(self, some_parameter=None):

        self.current_com = mpi.COMM_WORLD
        self.rank = self.current_com.rank
        self.nb_procs = self.current_com.size

        self.my_assert(some_parameter is not None)
        self.parameter = some_parameter
        print "Ok, parameter set to " + repr(self.parameter)

    # some class functions here...

    def my_assert(self, assertion):
        """
        this is a try for an assert function that kills 
        every process in a parallel run
        """
        if not assertion:
            print 'Traceback (most recent call last):'
            for line in traceback.format_stack()[:-1]:
                print(line.strip())
            print 'AssertionError'
            if self.nb_procs == 1:
                exit()
            else:
                self.current_com.Abort()

我认为下面的代码回答了这个问题。这是从丹D.的讨论中得出的

import mpi4py.MPI as mpi
import sys


# put this somewhere but before calling the asserts
sys_excepthook = sys.excepthook
def mpi_excepthook(type, value, traceback): 
    sys_excepthook(type, value, traceback) 
    if mpi.COMM_WORLD.size > 1:
        mpi.COMM_WORLD.Abort(1) 
sys.excepthook = mpi_excepthook 

# example:
if mpi.COMM_WORLD.rank == 0:
    # with sys.excepthook redefined as above this will kill every processor
    # otherwise this would only kill processor 0
    assert 1==0          

# assume here we have a lot of print messages
for i in range(50):
    print "rank = ", mpi.COMM_WORLD.rank

# with std asserts the code would be stuck here 
# and the error message from the failed assert above would hardly be visible
mpi.COMM_WORLD.Barrier()   

您可以考虑在搜索中出现的内容:<代码> MPI4PY在异常< /代码>停止。谢谢链接!我正在根据它写一个答案。