Heim > Backend-Entwicklung > Python-Tutorial > Beispielanalyse der Verwendung verzögerter Objekte im Twisted-Framework von Python

Beispielanalyse der Verwendung verzögerter Objekte im Twisted-Framework von Python

高洛峰
Freigeben: 2017-02-03 16:22:53
Original
1648 Leute haben es durchsucht

Deferred-Objektstruktur
Deferred besteht aus einer Reihe gepaarter Rückrufketten. Jedes Paar enthält einen Rückruf zur Erfolgsbehandlung (Callbacks) und einen Rückruf zur Fehlerbehandlung (Errbacks). Anfänglich bestehen Verzögerungen aus zwei leeren Rückrufketten. Beim Hinzufügen von Rückrufen werden diese immer paarweise hinzugefügt. Wenn das Ergebnis der asynchronen Verarbeitung zurückgegeben wird, startet die Verzögerung und löst die Rückrufkette in der Reihenfolge aus, in der sie hinzugefügt wurden.
Es ist möglicherweise einfacher, dies anhand von Beispielen zu veranschaulichen. Schauen wir uns zunächst addCallback an:

from twisted.internet.defer import Deferred
  
def myCallback(result):
  print result
  
d = Deferred()
d.addCallback(myCallback)
d.callback("Triggering callback.")
Nach dem Login kopieren

Wenn Sie es ausführen, erhalten Sie die folgenden Ergebnisse:

Triggering callback.
Nach dem Login kopieren

Im obigen Beispiel wird ein Deffered erstellt und seine addCallback-Methode wird verwendet, um einen Rückruf für die erfolgreiche Verarbeitung zu registrieren. d.callback startet verzögert und ruft die Rückrufkette auf. Die im Rückruf übergebenen Parameter werden auch von der ersten Funktion in jeder Rückrufkette empfangen.
Mit addCallback denke ich, dass ich auch vermuten kann, dass der andere falsche Zweig addErrorback ist. Schauen wir uns ein Beispiel an:

from twisted.internet.defer import Deferred
  
def myErrback(failure):
  print failure
  
d = Deferred()
d.addErrback(myErrback)
d.errback(ValueError("Triggering errback."))
Nach dem Login kopieren

Wenn Sie es ausführen, erhalten Sie die folgenden Ergebnisse: Ergebnis:

[Failure instance: Traceback (failure with no frames): <type &#39;exceptions.ValueError&#39;>: Triggering errback.]
Nach dem Login kopieren

Es ist ersichtlich, dass Twisted Fehler in Failure kapselt.
Es ist zu beachten, dass registrierte Rückrufe, wie bereits erwähnt, immer paarweise erfolgen. Wenn wir die Methoden d.addCallback und d.addErrorback verwenden, scheinen wir nur einen Callback oder einen Errback hinzuzufügen. Um die Erstellung dieser Ebene der Rückrufkette abzuschließen, registrieren diese Methoden tatsächlich auch einen Pass-Through für die andere Hälfte. Denken Sie daran, dass Rückrufketten immer gleich lang sind. Wenn Sie den Rückruf bzw. den Fehler dieser Rückrufebene angeben möchten. Sie können die d.addCallbacks-Methode verwenden:

d = Deferred()
d.addCallbacks(myCallback, myErrback)
d.callback("Triggering callback.")
Nach dem Login kopieren

Also... lasst uns heute hier aufhören.

Erweitertes Beispiel
Als nächstes sollten wir etwas Praktischeres tun, nämlich es in Reactor einfügen. Schauen wir uns zunächst ein Beispiel an:

from twisted.internet import reactor, defer
  
class HeadlineRetriever(object):
  def processHeadline(self, headline):
    if len(headline) > 50:
      self.d.errback(Exception("The headline ``%s&#39;&#39; is too long!" % (headline,)))
    else:
      self.d.callback(headline)
  
  def _toHTML(self, result):
    return "<h1>%s</h1>" % (result,)
  
  def getHeadline(self, input):
    self.d = defer.Deferred()
    reactor.callLater(1, self.processHeadline, input)
    self.d.addCallback(self._toHTML)
    return self.d
  
def printData(result):
  print result
  reactor.stop()
  
def printError(failure):
  print failure
  reactor.stop()
  
h = HeadlineRetriever()
d = h.getHeadline("Breaking News: Twisted Takes us to the Moon!")
d.addCallbacks(printData, printError)
  
reactor.run()
Nach dem Login kopieren

Das obige Beispiel empfängt einen Titel und verarbeitet ihn. Andernfalls wird ein überlanger Fehler zurückgegeben in HTML konvertiert und verarbeitet werden.

Da der angegebene Titel weniger als 50 Zeichen umfasst, führt die Ausführung des obigen Codes zu der folgenden Rückgabe:

<h1>Breaking News: Twisted Takes us to the Moon!</h1>
Nach dem Login kopieren

Bemerkenswert ist, dass dies der Fall war oben verwendet Die callLater-Methode des Reaktors kann verwendet werden, um zeitgesteuerte Ereignisse zu erstellen, um eine asynchrone Anforderung zu simulieren.

Wenn wir den Titel sehr lang machen, zum Beispiel:

h = HeadlineRetriever()
d = h.getHeadline("1234567890"*6)
d.addCallbacks(printData, printError)
Nach dem Login kopieren

Das Ergebnis wird erwartet:

[Failure instance: Traceback (failure with no frames): <type &#39;exceptions.Exception&#39;>: The headline ``123456789012345678901234567890123456789012345678901234567890&#39;&#39; is too long!]
Nach dem Login kopieren

Wir verwenden das Diagramm So sehen Sie sich den Auslösevorgang an:

Die wichtigsten Punkte in „Deferreds“ werden ausgelöst, wenn ihr Rückruf oder Errback aufgerufen wird.
2. Wenn Sie mehrmals versuchen, eine „Bereits aufgerufen“-Ausnahme auszulösen, wird eine Ausnahme im N-Level-Callback oder im Errback-Bereich an den N+1-Level-Errback übergeben geworfen werden. Wenn der Rückruf oder Fehler der N-ten Ebene keine Ausnahme auslöst oder ein Fehlerobjekt zurückgibt, wird er vom Rückruf der N+1-Ebene verarbeitet. Das im Rückruf zurückgegebene Ergebnis wird an den Rückruf der nächsten Ebene übergeben als erster Parameter dienen;
5. Wenn der an errback übergebene Fehler kein Failure-Objekt ist, wird er automatisch einmal umschlossen.

Weitere Beispiele zur Analyse der Verwendung verzögerter Objekte im Twisted-Framework von Python finden Sie auf der chinesischen PHP-Website für verwandte Artikel!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage