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