2009-08-23 5 views
26

In Parallel Python hat es etwas in den einreichen Funktion genannt Rückruf (documentation) aber es ist nicht, es scheint zu gut zu erklären. Ich habe vor ein paar Tagen in ihrem Forum gepostet und ich habe keine Antwort erhalten. Würde jemand erklären, was ein Callback ist und wofür es verwendet wird?Parallel Python: Was ist ein Rückruf?

Vielen Dank.

Antwort

104

Ein Rückruf ist eine Funktion, die vom Konsumenten einer API bereitgestellt wird, die die API dann umkehren und aufrufen kann (ruft Sie zurück). Wenn ich einen Termin für einen Arzt festlege, kann ich ihnen meine Telefonnummer geben, damit sie mich am Vortag anrufen können, um den Termin zu bestätigen. Ein Rückruf ist so, außer dass es sich dabei um eine Telefonnummer handelt, kann es willkürliche Anweisungen sein wie "sende mir eine Email an diese Adresse und rufe auch meine Sekretärin an und lass sie in meinen Kalender eintragen.

Callbacks sind Diese Funktion wird häufig in Situationen verwendet, in denen eine Aktion asynchron ist Wenn Sie eine Funktion aufrufen und sofort weiterarbeiten müssen, können Sie nicht darauf warten, dass der Rückgabewert Ihnen mitteilt, was passiert ist, damit Sie einen Rückruf bereitstellen Ist seine asynchrone Arbeit abgeschlossen, ruft sie dann Ihren Callback mit einigen vorgegebenen Argumenten auf (normalerweise einige, die Sie angeben, und einige über den Status und das Ergebnis der asynchronen Aktion, die Sie angefordert haben)

Wenn der Dr. out of the office ist oder sie arbeiten immer noch an dem Zeitplan, anstatt mich warten zu lassen, bis er zurückkommt, was mehrere Stunden dauern kann, legen wir auf, und sobald der Termin geplant ist, rufen sie mich an.

In diesem speziellen Fall ruft die Submit-Funktion von Parallel Python Ihren Callback mit allen Argumenten auf, die Sie angeben, und das Ergebnis func, nachdem func die Ausführung beendet hat.

+5

Das bekommt eine große Verbesserung von mir (immer noch nur das gleiche wie jede andere Upvote) für eine sehr verständliche Analogie, die wahrscheinlich für Anfänger hilfreich sein wird oder jemand, der neu in dieser Technik ist –

+1

Dies ist eine sehr gute Erklärung für Anfänger, es fehlt nur eine Sache - ein Beispielcode.Weil ein Anfänger jetzt weiß, was es ist, können Sie uns bitte ein einfaches Beispiel dafür geben, wie es aussehen würde Verwenden Sie Ihr Analog als Funktionsnamen ea: 'callDoctor() callPatientBack()' etc –

3

Blick auf den Link, sieht nur aus wie ein Haken, der aufgerufen wird.

Rückruf - Callback-Funktion, die wird mit dem Argument Liste gleich callbackargs + (Ergebnis) sobald Berechnung

Die „sobald Berechnung erfolgt“ getan wird aufgerufen Bit scheint mehrdeutig. Der Punkt, soweit ich von dieser Sache sehen kann, ist, dass die submit() Anruf Arbeit auf andere Server verteilt und dann zurückkehrt. Da das Finishing asynchron ist, eher Blockieren, ermöglicht es Ihnen, eine Funktion bereitzustellen, die aufgerufen wird, wenn eine Arbeitseinheit beendet wird. Wenn Sie das tun:

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

Dann wird sichergestellt, vorlegen work_finished() aufgerufen wird, wenn das Gerät von verteilten Arbeit auf dem Zielserver abgeschlossen ist.

Wenn Sie anrufen submit() Sie können einen Rückruf bereitzustellen, die in der gleichen Laufzeit wie der Aufrufer von submit() genannt wird ... und es wird aufgerufen, nachdem die Verteilung der Workload-Funktion abgeschlossen ist.

Art wie "Call foo (x, y), wenn Sie ein paar Sachen getan haben in submit()"

Aber ja, könnte die Dokumentation besser sein. Haben Sie eine ganders an der ppython Quelle und sehen, an welcher Stelle der Rückruf in submit()

14

die relevanten Stelle in der Dokumentation genannt wird:

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 

Also, wenn Sie einige Code wollen, sobald die ausgeführt werden Ergebnis ist bereit, Sie setzen diesen Code in eine Funktion und übergeben diese Funktion als das callback Argument. Wenn Sie keine anderen Argumente benötigen, wird es nur, z.B .:

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

Für mehr auf dem callback Muster in Python, siehe z.B. meine Präsentation here.

+1

Meinst du nicht "zur Zeit" statt "so lang"? – Dykam

+0

Ich meinte "so bald wie", genau wie die Dokumente, die ich zitiert habe - lassen Sie mich bearbeiten, um zu beheben, danke! –

+5

leider funktionieren deine Links nicht :( – bluish

1

Ein Rückruf ist einfach eine Funktion. In Python-Funktionen sind nur mehr Objekte, und so der Name einer Funktion kann als Variable verwendet werden, etwa so:

def func(): 
    ... 

something(func) 

Beachten Sie, dass viele Funktionen, die einen Rückruf als Argument in der Regel akzeptieren verlangen, dass der Rückruf akzeptieren bestimmte Argumente. In diesem Fall muss die Callback-Funktion eine Liste der in callbackargs angegebenen Argumente akzeptieren. Ich kenne Parallel Python nicht, daher weiß ich nicht genau, was es will.

3

Eine callback ist eine Funktion, die Sie definieren, die später von einer Funktion aufgerufen wird, die Sie anrufen.

Betrachten Sie als Beispiel, wie AJAX funktioniert: Sie schreiben Code, der eine Back-End-Serverfunktion aufruft. Irgendwann in der Zukunft kehrt es von dieser Funktion zurück (das "A" steht für Asynchronous, worum es bei "Parallel" in "Parallel Python" geht). Jetzt - weil Ihr Code den Code auf dem Server aufruft, soll er Ihnen sagen, wann er fertig ist, und Sie wollen etwas mit seinen Ergebnissen machen. Dies geschieht durch Aufruf der Callback-Funktion.

Wenn die aufgerufene Funktion abgeschlossen ist, ist die Standardmethode, die Ihnen sagt, dass es erledigt ist, darin zu bestehen, dass sie eine Funktion in Ihrem Code aufruft. Das ist die Callback-Funktion, deren Aufgabe es ist, die Ergebnisse/Ausgaben der von Ihnen aufgerufenen Funktion der unteren Ebene zu verarbeiten.