Мне кажется, что в коде python, который работает параллельно, утверждение, которое не удалось, по крайней мере, одному процессору, должно прервать все процессоры, так что:Согласованное утверждение для параллельных прогонов в python?
1) сообщение об ошибке ясно видно (с трассировка стека)
2) оставшиеся процессоры не ждут навсегда.
Однако это не то, что делает стандартное утверждение.
Этот вопрос уже задан в python script running with mpirun not stopping if assert on processor 0 fails , но я не удовлетворен ответом. Там предлагается использовать функцию comm.Abort(), но это только соответствует пункту 2) выше.
Итак, мне было интересно: существует ли стандартная функция «assert» для параллельных кодов (например, с mpi4py), или я должен написать свои собственные утверждения для этой цели?
Спасибо!
Edit - вот моя попытка (в классе, но может быть снаружи), которые, безусловно, могут быть улучшены:
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()
Вы могли бы рассмотреть https://groups.google.com/forum/#!topic/mpi4py/me2TFzHmmsQ, который появляется в поиске: 'mpi4py остановки на исключение ' –
Спасибо за ссылку! На этом я пишу ответ. –