2009-08-23 9 views
26

Nel ha qualcosa nella funzione invia chiamata chiamata (documentation) tuttavia non sembra spiegarlo troppo bene. Ho postato sul loro forum un paio di giorni fa e non ho ricevuto risposta. Qualcuno potrebbe spiegare cos'è un callback e a cosa serve?Python parallelo: che cos'è un callback?

Grazie.

risposta

104

Un callback è una funzione fornita dall'utente di un'API che l'API può quindi attivare e richiamare (richiamando). Se imposto un appuntamento con il dottore, posso dare loro il mio numero di telefono, in modo che possano chiamarmi il giorno prima per confermare l'appuntamento. Una richiamata è così, tranne che per il semplice fatto di essere un numero di telefono, può essere istruzioni arbitrarie come "mandami una email a questo indirizzo, chiama anche la mia segretaria e falla mettere nel mio calendario

Le richiamate sono spesso utilizzato in situazioni in cui un'azione è asincrona. Se devi chiamare una funzione e continuare immediatamente a lavorare, non puoi sederti lì in attesa del suo valore di ritorno per farti sapere cosa è successo, quindi fornisci un callback. viene eseguito completamente il suo lavoro asincrono, quindi invocherà il callback con alcuni argomenti predeterminati (in genere alcuni forniti dall'utente e alcuni sullo stato e il risultato dell'azione asincrona richiesta).

Se il Dr. è fuori ufficio , o stanno ancora lavorando sul programma, invece di farmi aspettare in attesa fino al suo ritorno, che potrebbe essere di diverse ore, riagganciamo, e una volta che l'appuntamento è stato programmato, mi chiamano.

In questo caso specifico, la funzione di invio di Parallel Python invocherà la richiamata con qualsiasi argomento fornito e il risultato di func, una volta terminato l'esecuzione di func.

+5

Questo da me ottiene un grande sconto (vale comunque lo stesso valore di qualsiasi altro upvote) per un'analogia molto comprensibile che sarà probabilmente utile per i principianti o chiunque sia nuovo a questa tecnica –

+1

Questa è un'ottima spiegazione per i principianti, manca solo una cosa: un codice di esempio. Ora che un principiante sa di cosa si tratta, potresti darci un semplice esempio di come sarebbe? usando il tuo analogo come nomi di funzioni ea: 'callDoctor() callPatientBack()' etc –

3

Guardando il collegamento, sembra proprio un gancio che viene chiamato.

callback - funzione di callback che sarà chiamato con l'argomento lista pari a callbackargs + (risultato,) non appena calcolo viene effettuato

Il "non appena il calcolo viene fatto" bit sembra ambiguo. Il punto, per quanto posso vedere di questa cosa è che la chiamata submit() distribuisce lavoro ad altri server e quindi restituisce. Poiché la finitura è asincrona, piuttosto bloccata, consente di fornire una funzione che viene chiamata al termine di alcune unità di lavoro. Se lo fai:

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

quindi inviare garantirà work_finished() viene chiamato quando l'unità di lavoro distribuita è completata sul server di destinazione.

Quando si chiama submit() è possibile fornire un callback che si chiama nello stesso tempo di esecuzione come il chiamante di submit() ... ed è chiamato dopo la distribuzione della funzione di carico di lavoro è completo.

Un po 'come "chiamata foo (x, y) quando avete fatto alcune cose in submit()"

Ma sì, la documentazione potrebbe essere migliore. Avere un paperi alla fonte ppython e vedere a questo punto il callback viene chiamata in submit()

14

Il punto rilevante nella documentazione:

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 

Quindi, se volete qualche codice da eseguire non appena il il risultato è pronto, si inserisce quel codice in una funzione e si passa tale funzione come argomento callback. Se non avete bisogno di altri argomenti, sarà solo, ad es .:

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

Per maggiori informazioni sul modello callback in Python, vedi per esempio la mia presentazione here.

+1

Non intendi "al momento" anziché "tanto tempo"? – Dykam

+0

Intendevo "non appena", proprio come i documenti che ho citato - fammi modificare per risolvere, grazie! –

+5

sfortunatamente i tuoi link non funzionano :( – bluish

1

Una richiamata è semplicemente una funzione. In Python, le funzioni sono solo più oggetti, e così il nome di una funzione può essere usato come una variabile, in questo modo:

def func(): 
    ... 

something(func) 

Nota che molte funzioni che accettano un callback come un argomento di solito richiedono che il callback accetta alcuni argomenti. In questo caso, la funzione di callback dovrà accettare un elenco di argomenti specificati in callbackargs. Non ho familiarità con Parallel Python quindi non so esattamente cosa vuole.

3

A callback è una funzione definita dall'utente chiamata in seguito da una funzione chiamata.

Ad esempio, considerare come funziona AJAX: si scrive codice che chiama una funzione server back-end. Ad un certo punto nel futuro, ritorna da quella funzione (la "A" sta per Asincrono, che è ciò che è il "Parallel" in "Parallel Python"). Ora, perché il tuo codice chiama il codice sul server, vuoi che ti dica quando è finito e vuoi fare qualcosa con i suoi risultati. Lo fa chiamando la funzione di richiamata .

Quando la funzione chiamata viene completata, il modo standard per dirvi che è fatto è che gli dite di chiamare una funzione nel vostro codice. Questa è la funzione di callback e il suo compito è gestire i risultati/l'output dalla funzione di livello inferiore che hai chiamato.

Problemi correlati