Разница между «выходом» Торнадо и «выходом из» асинчо в механизме?

В Tornado мы обычно пишем следующий код для вызова функции асинхронно:

class MainHandler(tornado.web.RequestHandler): @tornado.gen.coroutine def post(self): ... yield self.handleRequest(foo) ... @tornado.gen.coroutine def handleRequest(self, foo): ... 

Но в asyncio (будет поставляться с Python 3.4, можно установить из pip для Python 3.3), мы используем yield from для достижения того же:

 @asyncio.coroutine def myPostHandler(): ... yield from handleRequest(foo) ... @asyncio.coroutine def handleRequest(foo) ... 

Увидев из кода, разница – это yield и yield from . Однако прежний handleRequest(foo) возвращает объект tornado.concurrent.Future , последний возвращает объект- generator .

Мой вопрос в том, в чем разница между двумя вещами в механизме? Как проходит контроль? И кто вызывает фактический handleRequest и получает возвращаемое значение?

Append: Я имею базовые знания о генераторах Python и итераторах. Я хотел понять, что достигли Торнадо и Асинчио, используя их, и в чем разница между этими двумя механизмами.

One Solution collect form web for “Разница между «выходом» Торнадо и «выходом из» асинчо в механизме?”

Существует огромная разница между ними. yield from принимает другой генератор и продолжает уступать от этого генератора (делегируя ответственность как бы). yield дает только одно значение.

Другими словами, yield from в простейшем случае может быть заменена на:

 for value in self.handleRequest(foo): yield value 

Если вы заменили yield from <expression> строки yield from <expression> с помощью yield <expression> вы вернете весь генератор вызывающему, а не значения, которые генерирует генератор.

yield from синтаксиса был введен только в Python 3.3, см. PEP 380: Синтаксис для делегирования на подгенератор . Tornado поддерживает версии Python 2.6, 2.7 и 3.2 в дополнение к Python 3.3, поэтому он не может полагаться на yield from имеющегося синтаксиса. asyncio , с другой стороны, будучи базовой библиотекой Python, добавленной в 3.4, может полностью полагаться на yield from синтаксиса делегирования генератора.

В результате, Tornado должен будет выполнить пост-обработку значений, полученных от генератора @tornado.gen.coroutine чтобы обнаружить, что tornado.concurrent.Future объект был получен; @asyncio.coroutine кода @asyncio.coroutine может быть намного проще. И действительно, метод Tornado Runner.run() выполняет явные проверки типов для обработки делегированных задач.

  • Можно ли улучшить этот скрипт Python?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.