Python paralelo: ¿Qué es una devolución de llamada?
callback parallel-python (5)
El spot relevante en la documentación:
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
Entonces, si desea que se ejecute algo de código tan pronto como el resultado esté listo, coloque ese código en una función y pase esa función como el argumento de callback
. Si no necesita otros argumentos, será justo, por ejemplo:
def itsdone(result):
print "Done! result=%r" % (result,)
...
submit(..., callback=itsdone)
Para obtener más información sobre el patrón de callback
en Python, consulte, por ejemplo, mi presentación here .
En Parallel Python tiene algo en la función de envío llamado devolución de llamada ( documentation ), sin embargo, no parece explicarlo muy bien. He publicado en su foro hace un par de días y no he recibido una respuesta. ¿Alguien explicaría qué es una devolución de llamada y para qué se utiliza?
Gracias.
Mirando el enlace, solo se ve como un gancho que se llama.
devolución de llamada - función de devolución de llamada que se llamará con la lista de argumentos igual a callbackargs + (resultado,) tan pronto como se realice el cálculo
El bit "tan pronto como se realiza el cálculo" parece ambiguo. El punto, por lo que puedo ver de esto, es que la llamada submit()
distribuye el trabajo a otros servidores y luego regresa. Debido a que el acabado es asíncrono, en lugar de bloque, le permite proporcionar una función que se llama cuando finaliza alguna unidad de trabajo. Si lo haces:
submit( ..., callback=work_finished, ... )
Luego, enviará asegurará que se work_finished()
cuando se complete la unidad de trabajo distribuido en el servidor de destino.
Cuando llama a submit()
puede proporcionar una devolución de llamada que se llama en el mismo tiempo de ejecución que el llamador de submit()
... y se llama después de que se completa la distribución de la función de carga de trabajo.
Algo así como "call foo (x, y) cuando has hecho algunas cosas en submit ()"
Pero sí, la documentación podría ser mejor. Tenga un ganders en la fuente de ppython y vea en qué punto se llama a la devolución de llamada en submit()
Una callback es una función que define y que luego es llamada por una función a la que llama.
Como ejemplo, considere cómo funciona AJAX: usted escribe un código que llama a una función de servidor back-end. En algún momento en el futuro, regresará de esa función (la "A" significa Asíncrono, que es de lo que se trata el "Paralelo" en "Parallel Python"). Ahora, debido a que su código llama al código en el servidor, quiere que le diga cuándo está hecho y desea hacer algo con sus resultados. Lo hace llamando a su función de devolución de llamada .
Cuando se completa la función llamada, la forma estándar de que le diga que ha terminado es que le diga que llame a una función en su código. Esa es la función de devolución de llamada, y su trabajo es manejar los resultados / resultados de la función de nivel inferior a la que ha llamado.
Una devolución de llamada es simplemente una función. En Python, las funciones son solo más objetos, por lo que el nombre de una función se puede usar como una variable, de esta manera:
def func():
...
something(func)
Tenga en cuenta que muchas funciones que aceptan una devolución de llamada como un argumento generalmente requieren que la devolución de llamada acepte ciertos argumentos. En este caso, la función de devolución de llamada tendrá que aceptar una lista de argumentos especificados en callbackargs. No estoy familiarizado con Parallel Python, así que no sé exactamente lo que quiere.
Una devolución de llamada es una función proporcionada por el consumidor de una API que la API puede activar e invocar (devolverle la llamada). Si programo una cita con el Dr., puedo darles mi número de teléfono para que puedan llamarme el día anterior para confirmar la cita. Una devolución de llamada es así, excepto que en lugar de ser solo un número de teléfono, pueden ser instrucciones arbitrarias como "envíeme un correo electrónico a esta dirección y también llame a mi secretaria y pídale que la incluya en mi calendario.
Las devoluciones de llamada a menudo se utilizan en situaciones en las que una acción es asíncrona. Si necesita llamar a una función e inmediatamente continuar trabajando, no puede quedarse sentado esperando el valor de retorno para informarle lo que sucedió, por lo que debe devolver la llamada. Cuando la función haya finalizado por completo su trabajo asíncrono, invocará su devolución de llamada con algunos argumentos predeterminados (generalmente algunos de los que proporciona y otros sobre el estado y el resultado de la acción asíncrona que solicitó).
Si el Dr. está fuera de la oficina, o aún están trabajando en el horario, en lugar de que yo espere hasta que él regrese, lo que podría ser varias horas, colgamos y, una vez que se ha programado la cita, Llámame.
En este caso específico, la función de envío de Parallel Python invocará su devolución de llamada con cualquier argumento que proporcione y el resultado de la func
, una vez que la func
haya terminado de ejecutarse.