Я выполнял функцию в пуле из N однопоточных рабочих (на N машинах) с client.map, и один из рабочих потерпел неудачу. Мне было интересно, есть ли способ автоматически обрабатывать исключения, выдвинутые работником, перераспределять свои невыполненные задачи другим работникам и игнорировать или исключать их из пула?
Я пытался смоделировать проблему с помощью методов, показанных ниже. Чтобы вызвать сбой одного работника, я вызываю на нем ошибку OSE в my_function
, которая передается в client.map
следующим образом: futures = client.map(my_function, range(100))
. В моем примере, рабочий на 'Computer123' будет тем, кто потерпит неудачу. Для обработки исключений, выданных my_function
, я использую sys.exit в exception_handler
. Поэтому, когда задача не выполняется на рабочем месте, вызывается sys.exit. Результатом является то, что распределенный.nanny плохого работника ловит сбой и перезапускает работника, в то время как клиент перераспределяет свои невыполненные задачи. Но как только плохой работник снова возвращается, он снова получает задания, потому что все еще находится в пуле. Это снова не удается, и процесс повторяется. Поскольку это продолжает терпеть неудачу, в конечном счете другие рабочие выполняют все задачи. Было бы идеально, если бы я мог автоматически обрабатывать исключения от плохих работников, таких как 'Computer123', и удалять его из пула. Может быть, все, что мне нужно сделать, это удалить его из пула?
@exception_handler
def my_function(x):
import socket
import time
time.sleep(5)
if socket.gethostname() == 'Computer123':
raise(OSError)
else:
return x**2
def exception_handler(orig_func):
def wrapper(*args,**kwargs):
try:
return orig_func(*args,**kwargs)
except:
import sys
sys.exit(1)
return wrapper