tornado python example
¿Diferencia entre el "rendimiento" del Tornado y el "rendimiento de" del mecanismo? (1)
Hay una gran diferencia entre los dos. yield from
toma otro generador y continúa el rendimiento de ese generador (delegando la responsabilidad, por así decirlo). yield
solo produce un valor.
En otras palabras, el yield from
, en el caso más simple, podría ser reemplazado por:
for value in self.handleRequest(foo):
yield value
Si reemplaza un yield from <expression>
con el yield <expression>
, devolverá todo el generador a la persona que llama, no los valores que produce ese generador.
El yield from
sintaxis solo se introdujo en Python 3.3, consulte PEP 380: Sintaxis para delegar a un subgenerador . Tornado es compatible con las versiones 2.6, 2.7 y 3.2 de Python, además de Python 3.3, por lo que no puede confiar en el yield from
sintaxis disponible. asyncio
, por otro lado, al ser una biblioteca central de Python agregada en 3.4, puede confiar plenamente en el yield from
sintaxis de delegación yield from
generador que está disponible.
Como resultado, Tornado tendrá que postprocesar los valores generados por un generador @tornado.gen.coroutine
para detectar que se tornado.concurrent.Future
un objeto tornado.concurrent.Future
; El manejo del código @asyncio.coroutine
puede ser mucho más simple. Y, de hecho, el Runner.run()
Tornado Runner.run()
realiza verificaciones de tipos explícitos para manejar las tareas delegadas.
En Tornado, generalmente escribimos el siguiente código para llamar a una función de forma asíncrona:
class MainHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def post(self):
...
yield self.handleRequest(foo)
...
@tornado.gen.coroutine
def handleRequest(self, foo):
...
Pero en asyncio (se enviará con Python 3.4, se puede instalar desde pip para Python 3.3), usamos el yield from
para lograr lo mismo:
@asyncio.coroutine
def myPostHandler():
...
yield from handleRequest(foo)
...
@asyncio.coroutine
def handleRequest(foo)
...
Viendo desde el código, la diferencia es el yield
y el yield from
. Sin embargo, el anterior handleRequest(foo)
devuelve un objeto tornado.concurrent.Future
, el último devuelve un objeto generator
.
Mi pregunta es, ¿cuál es la diferencia entre las dos cosas en el mecanismo? ¿Cómo es el flujo de control? ¿Y quién llama el verdadero handleRequest
y recupera su valor de retorno?
Anexar: Tengo conocimientos básicos de generadores e iteradores de Python. Quería entender lo que Tornado y asyncio lograron al usar estos, y cuál es la diferencia entre esos dos mecanismos.