example python generator tornado yield

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.