在写入客户端之前链接异步操作(python - tornado)

时间:2012-02-21 12:48:37

标签: python tornado

在简单的异步情况下,处理程序可能如下所示:

@tornado.web.authenticated
@tornado.web.asynchronous
def post(self):
    AsyncHTTPClient().fetch("http://api.example.com/", self.on_post_response)

def on_post_response(self, response):
    self.render("template.html", status=response.error)

但是,在我需要执行两次异步操作(获取远程rest api,然后发送包含结果的邮件)之前,我已经到了这一点。

我想知道是否有“buit-in”方式来做到这一点,例如通过向队列添加回调(如ioloop.add_callback)或者我是否必须编写一个自定义对象来管理这些任务及其状态,并从post调用它。

1 个答案:

答案 0 :(得分:4)

您是否考虑过以下方法?

@tornado.web.authenticated
@tornado.web.asynchronous
def post(self):
    async_fetch(..., self._on_fetch_response)

def _on_fetch_response(self, response):
    async_mail(response, self._on_mail_response)

def _on_mail_response(self, response):
    self.render(...) # render() automatically calls self.finish()

或使用tornado.gen

@asynchronous
@gen.engine
def post(self):
    fetch_response = yield gen.Task(async_fetch, ...)
    mail_response = yield gen.Task(async_mail, ...)
    self.render(...)