В 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 и итераторах. Я хотел понять, что достигли Торнадо и Асинчио, используя их, и в чем разница между этими двумя механизмами.