Параллельный Python: что такое обратный вызов? - PullRequest
38 голосов
/ 23 августа 2009

В Parallel Python в функции submit есть нечто, называемое callback ( документация ), однако, похоже, что объясни это слишком хорошо. Я разместил на их форуме пару дней назад и не получил ответа. Кто-нибудь объяснит, что такое обратный вызов и для чего он используется?

Спасибо.

Ответы [ 5 ]

150 голосов
/ 23 августа 2009

Обратный вызов - это функция, предоставляемая потребителем API, которую API может затем развернуть и вызвать (перезвонить вам). Если я назначу встречу с доктором, я могу дать им свой номер телефона, чтобы они могли позвонить мне накануне, чтобы подтвердить встречу. Обратный вызов такой же, за исключением того, что это просто номер телефона, это могут быть произвольные инструкции типа «отправьте мне электронное письмо по этому адресу, а также позвоните моему секретарю и сделайте так, чтобы она внесла его в мой календарь».

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

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

В этом конкретном случае функция submit в Parallel Python будет вызывать ваш обратный вызов с любыми предоставленными вами аргументами и результатом func после завершения func.

18 голосов
/ 23 августа 2009

Соответствующее место в документах:

callback - callback function which will be called with argument 
        list equal to callbackargs+(result,) 
        as soon as calculation is done
callbackargs - additional arguments for callback function

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

def itsdone(result):
  print "Done! result=%r" % (result,)
...
submit(..., callback=itsdone)

Подробнее о шаблоне callback в Python см., Например, моя презентация здесь .

4 голосов
/ 23 августа 2009

Глядя на ссылку, просто выглядит как крючок, который называется.

callback - функция обратного вызова, которая будет вызван с аргументом список, равный callbackargs + (результат,) как только расчет будет выполнен

Бит "как только вычисление сделано" кажется неоднозначным. Дело в том, что, насколько я вижу, это то, что вызов submit() распределяет работу по другим серверам, а затем возвращает. Поскольку окончание является асинхронным, а скорее блочным, оно позволяет вам предоставить функцию, которая вызывается, когда завершается какая-то единица работы. Если вы делаете:

submit( ..., callback=work_finished, ... )

Тогда submit будет гарантировать, что work_finished() вызывается, когда единица распределенной работы завершается на целевом сервере.

Когда вы вызываете submit(), вы можете предоставить callback , который вызывается в той же среде выполнения, что и вызывающий submit() ... и вызывается после завершения распределения функции рабочей нагрузки. .

Вроде как "call foo (x, y), когда вы сделали что-то в submit ()"

Но да, документация могла бы быть лучше. Соберите гандеров у источника ppython и посмотрите, в какой момент обратный вызов вызывается в submit()

3 голосов
/ 23 августа 2009

A callback - это определяемая вами функция, которая позже вызывается вызываемой вами функцией.

В качестве примера рассмотрим, как работает AJAX: вы пишете код, который вызывает функцию внутреннего сервера. В какой-то момент в будущем он вернется из этой функции («А» означает «Асинхронный», что и означает «Параллель» в «Параллельный Питон») Теперь, потому что ваш код вызывает код на сервере, вы хотите, чтобы он сообщал вам, когда это будет сделано, и вы хотите что-то сделать с его результатами. Это делается путем вызова вашей функции обратного вызова .

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

1 голос
/ 23 августа 2009

Обратный вызов - это просто функция. В Python функции - это просто больше объектов, поэтому имя функции можно использовать как переменную, например:

def func():
    ...

something(func)

Обратите внимание, что многие функции, которые принимают обратный вызов в качестве аргумента, обычно требуют, чтобы обратный вызов принимал определенные аргументы. В этом случае функция обратного вызова должна будет принять список аргументов, указанных в callbackargs. Я не знаком с Parallel Python, поэтому точно не знаю, чего он хочет.

...