2009-08-23 15 views

Respuesta

104

Una devolución de llamada es una función proporcionada por el consumidor de una API que la API puede dar vuelta e invocar (devolverle la llamada). Si configuro 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 simplemente ser 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ídala que lo ponga en mi calendario"

Las devoluciones de llamada son a menudo se usa en situaciones en las que una acción es asincrónica. Si necesita llamar a una función e inmediatamente continuar trabajando, no puede quedarse sentado allí esperando su valor de retorno para informarle lo que sucedió, de modo que usted proporciona una devolución de llamada. se realiza completamente su trabajo asíncrono, invocará su devolución de llamada con algunos argumentos predeterminados (generalmente algunos suministran, y algunos sobre el estado y el resultado de la acción asincrónica que solicitó).

Si el Dr. está fuera de la oficina , o todavía están trabajando en el horario, en lugar de tener que esperar en espera hasta que regrese, lo que podría ser varias horas, colgamos, y una vez programada la cita, me llaman.

En este caso específico, la función de envío de Parallel Python invocará su devolución de llamada con cualquier argumento que usted proporcione y el resultado de func, una vez que func haya terminado de ejecutarse.

+5

Esto obtiene un gran voto positivo de mi parte (todavía vale la pena lo mismo que cualquier otro voto alternativo) para una analogía muy comprensible que probablemente sea útil para principiantes o alguien nuevo en esta técnica. –

+1

Esta es una muy buena explicación para los principiantes, solo le falta una cosa: un código de muestra. Ahora que un principiante sabe de qué se trata, ¿podría darnos un ejemplo simple de cómo se vería? usando su análogo como nombres de función ea: 'callDoctor() callPatientBack()' etc. –

3

Mirando el enlace, simplemente se ve como un gancho que se llama.

devolución de llamada - llamada de retorno, que se llamará con el argumento lista igual a callbackargs + (resultado,) tan pronto como el cálculo se realiza

El "tan pronto como se realiza el cálculo" poco parece ambiguo. El punto, en 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 asincrónico, más bien de bloqueo, le permite proporcionar una función que se llama cuando termina una unidad de trabajo. Si lo hace:

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

luego presentar asegurará work_finished() se llama cuando la unidad de trabajo distribuida se completa en el servidor de destino.

Cuando se llama a submit() le puede proporcionar una devolución de llamada que se llama en el mismo tiempo de ejecución como la persona que llama de submit() ... y es llamado después de la distribución de la función de la carga de trabajo se haya completado.

Algo así como "foo llamada (x, y) cuando se han hecho algunas cosas en submit()"

Pero sí, la documentación podría ser mejor. Tener una gansos en la fuente ppython y ver en que punto la devolución de llamada se llama en submit()

14

El punto 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 

Por lo tanto, si quieres algo de código que se ejecutará tan pronto como el el resultado está listo, coloca ese código en una función y pasa esa función como el argumento callback. Si no necesita otros argumentos, que será igual, por ejemplo .:

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

Para más información sobre el patrón callback en Python, ver por ejemplo, mi presentación here.

+1

¿No quiere decir "en ese momento" en lugar de "siempre"? – Dykam

+0

Quise decir "tan pronto como", al igual que los documentos que cité, déjenme editar para corregirlo, ¡gracias! –

+5

desafortunadamente sus enlaces no funcionan :( – bluish

1

Una devolución de llamada es simplemente una función. En Python, las funciones son simplemente más objetos, por lo que el nombre de una función puede ser utilizado como una variable, así:

def func(): 
    ... 

something(func) 

Tenga en cuenta que muchas de las funciones que aceptan una devolución de llamada como un argumento por lo general requieren que la devolución de llamada acepta ciertos argumentos En este caso, la función de devolución de llamada deberá aceptar una lista de argumentos especificados en callbackargs. No estoy familiarizado con Parallel Python, así que no sé exactamente lo que quiere.

3

A callback es una función que define que luego llama una función que llama.

Como ejemplo, considere cómo funciona AJAX: escribe código que llama a una función de servidor de fondo. En algún momento en el futuro, regresa de esa función (la "A" significa Asincrónico, que es lo que trata el "Paralelo" en "Parallel Python"). Ahora, debido a que su código llama al código en el servidor, quiere que le avise cuando está listo y desea hacer algo con sus resultados. Lo hace llamando a la función de devolución de llamada .

Cuando la función llamada finaliza, la forma estándar de decirle que está listo es que usted le diga que invoque 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 que ha llamado.

Cuestiones relacionadas