Разница между AysncResult и обратным вызовом с error_callback в пулах Python - PullRequest
0 голосов
/ 02 октября 2018

Я использую Pools для запуска рабочих процессов в python3.6.Рабочие вернут True или False после завершения, и мне было интересно, в чем разница между использованием возвращаемого объекта AsyncResult или функцией обратного вызова для проверки, вернул ли работник True или False.Насколько я понимаю, обратный вызов вызывается в основном процессе, то же самое место, где я бы все равно делал проверку.

#Using the AsyncResult way
def check_result(result):
  if result:
    #Successful do something
  else:
    #Failed

with Pool() as pool:
  result = pool.apply_async(upload, (args, ))
  check_result(result.get())

#Using callbacks 

def check_result(result):
  if result:
    #Successful do something

def err_result(result):
  #Do something

with Pool() as pool:
  pool.appy_async(upload, (args,), callback=check_result, error_callback=err_result)

Я вижу, что в python3.6 они позволяют error_callback, так что эти два бита кода эквивалентны?Каковы плюсы и минусы обоих?

Спасибо

1 Ответ

0 голосов
/ 03 октября 2018

Сравнение AsyncResult и callback несколько неудачно.Обратите внимание, что у вас есть только обратные вызовы для асинхронных методов (возвращающие AsyncResult объекты), поэтому в этой истории нет «против» в отношении этих вещей.

Когда вы пишете check_result(result.get()), вы не передаете некоторый AsyncResult -объект в check_result, но уже ожидаемый нормальный результат, в вашем случае логическое значение (если не исключение).Так что разница не между AsyncResult и callback, а между ручным вызовом check_result для результата или предварительной регистрацией обратного вызова.

Я вижу, что в python3.6 они допускают error_callback,так эти два бита кода эквивалентны?Каковы плюсы и минусы обоих?

Нет, эти два фрагмента не эквивалентны.error_callback - обработчик исключений, ваш возможный False-результат не сработает, но сработает исключение.В таком случае ваш аргумент result в пределах err_result будет заполнен экземпляром исключения.Разница с вашим верхним фрагментом в том, что на вашем лице возникнет исключение, как только вы позвоните по номеру result.get(), и вы не заключите его в блок try-Кроме-блока.

Очевидное «за»'error_callback - это пропущенный блок try-исключением,' pro 'обычного обратного вызова также уменьшает длину кода.Используйте оба только для немедленного возврата задач, таких как проверка и ведение журнала, чтобы предотвратить блокировку потока, в котором работает ваш пул.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...