Ответ 1
Существует огромная разница между ними. yield from
берет другой генератор и продолжает уступать от этого генератора (делегируя ответственность как бы). yield
дает только одно значение.
Другими словами, yield from
, в простейшем случае, можно заменить на:
for value in self.handleRequest(foo):
yield value
Если вы заменили строку 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
может быть намного проще. И действительно, метод Tornado Runner.run()
выполняет явные проверки типов для обработки делегированных задач.