【发布时间】:2014-01-28 01:54:08
【问题描述】:
在 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 一起提供,可以从 Python 3.3 的 pip 安装),我们使用 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 并检索其返回值?
附加:我对 Python 生成器和迭代器有基本的了解。我想了解 Tornado 和 asyncio 通过使用这些实现了什么,以及这两种机制之间有什么区别。
【问题讨论】:
标签: python generator tornado yield