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