Как мне игнорировать работника, чьи задачи не были выполнены, и перераспределять его задачи другим работникам? - PullRequest
0 голосов
/ 27 марта 2019

Я выполнял функцию в пуле из 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

1 Ответ

0 голосов
/ 27 марта 2019

В качестве обходного пути вы можете сохранить словарь плохих работников, добавляя к нему имя хоста каждый раз, когда вы определяете, что оно плохое (возможно, после того, как оно вызывает определенное количество исключений).

Затем, когда вы хотите выполнить какое-либо задание, проверьте, есть ли оно в списке нарушителей. Что-то вроде:

  if socket.gethostname() in badHosts:
    skip
  else:
    do_something()

Если вы можете дать более подробную информацию о том, как вы управляете пулом, к которому вы подключаетесь, я мог бы предложить еще несколько советов о том, как удалить их напрямую, вместо того, чтобы проверять их каждый раз.

...