Ejemplo Twisted detalladas para el uso en el marco de objeto Diferido Python

objeto diferido por Twsited marco para el manejo de las devoluciones de llamada, que por confiar en Twisted asíncrona es muy importante, entonces tenemos que resolver los ejemplos de uso de Python marco trenzado del objeto diferido.

Diferido cadena de devolución de llamada por una serie de pares, cada par contiene una devolución de llamada (devoluciones de llamada) para un tratamiento exitoso y una devolución de llamada para el manejo de errores (errbacks). Inicialmente, deffereds por dos cadenas de devolución de llamada vacías. Siempre se añadió en pares cuando se agrega una devolución de llamada a la misma. Cuando el resultado del procesamiento asíncrono de los retornos, difieren y comenzará en la orden cuando la devolución de llamada gatillo cadena agregó.

Quizás más fácil de explicar con un ejemplo, la primera mirada addCallback:

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

Ejecutarlo obtendrá los siguientes resultados:

Triggering callback.

El ejemplo crea un DEFFERED y utilizar su método addCallback para registrar una devolución de llamada para un tratamiento exitoso. d.callback comienza DEFFERED y llamadas de devolución de llamada cadena. parámetro de devolución de llamada será pasada en cada primera cadena de funciones de devolución de llamada recibe.

Hay addCallback, otro error de esa rama, me gustaría ser capaz de adivinar que addErrorback, la misma vistazo a un ejemplo:

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

Ejecutarlo obtendrá los siguientes resultados:

[Failure instance: Traceback (failure with no frames): <type 'exceptions.ValueError'>: Triggering errback.]

Twisted error sería visto en el fracaso encapsulado.

Vale la pena señalar que la referencia se había registrado antes de la devolución de llamada siempre se empareja. Cuando se utiliza el método d.addCallback y d.addErrorback, parecemos acaba de agregar una devolución de llamada o una errback.

De hecho, con el fin de completar la creación de esta cadena de devolución de llamada de nivel, estos métodos serán para la otra mitad registró un paso a través. Recuerde, la cadena de devolución de llamada siempre tienen la misma longitud. Si desea especificar una devolución de llamada esta devolución de llamada y errback respectivamente.

métodos D.addCallbacks se pueden utilizar:

d = Deferred()
d.addCallbacks(myCallback, myErrback)
d.callback("Triggering callback.")

Entonces debería ser el punto más práctico, es decir, en el reactor.

Echemos un vistazo a un ejemplo:

from twisted.internet import reactor, defer
class HeadlineRetriever(object):
def processHeadline(self, headline):
if len(headline) > 50:
self.d.errback(Exception("The headline ``%s'' 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()

Recibir un título de casos y procesos, si el título volverá error de tiempo largo, de lo contrario se convierte en HTML y la espalda.

El título dado por menos de 50 caracteres, se volvió a realizar el código anterior es como sigue:

<h1>Breaking News: Twisted Takes us to the Moon!</h1>

Vale la pena destacar, por encima de los usos del método callLater el reactor, que se pueden utilizar para los eventos programados para simular una solicitud asincrónica.

Si nos volvemos título muy larga, por ejemplo:

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

Ese resultado se puede cumplir

[Failure instance: Traceback (failure with no frames): : The headline ``123456789012345678901234567890123456789012345678901234567890'' is too long!

archivo

Nos fijamos en el mapa para desencadenar el proceso:

  • El punto clave en Deferreds

  • Deferreds se activarán cuando se llama a su devolución de llamada o errback;

  • Deferreds sólo puede activarse una vez! Si intenta disparar varias veces resultará en AlreadyCalledError anormal;

  • Errback de devolución de llamada o serán pasados ​​etapa N Excepciones en una primera etapa N + errback 1;. Y si no errback, se produce no controlada de error. Si el N-ésimo errback etapa de devolución de llamada o no retorno o lanza objetos, si no excepción, que será procesada por una etapa subsiguiente N + 1 de la devolución de llamada;

  • Resultados de devolución de llamada de devolución de llamada devuelto serán pasados ​​a la siguiente etapa, como primer parámetro;

  • Si el objeto no es un error Fallo de entrada errback, automáticamente se llena una vez.

Publicado 38 artículos originales · ganado elogios 1 · vistas 2182

Supongo que te gusta

Origin blog.csdn.net/wulishinian/article/details/104970772
Recomendado
Clasificación