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

高洛峰
高洛峰Original
2017-02-03 16:22:531646Durchsuche

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.")

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

Triggering callback.

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."))

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.]

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.")

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()

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>

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)

Das Ergebnis wird erwartet:

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

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!

Stellungnahme:
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