Tornado:我可以在异步RequestHandler中调用self.finish()后运行代码吗?

时间:2012-10-02 18:44:11

标签: python tornado

我正在使用龙卷风。我有一堆异步请求处理程序。他们中的大多数都是异步地完成工作,然后将该工作的结果报告给用户。但是我有一个处理程序,它的工作就是简单地告诉用户他们的请求将在未来的某个时刻进行处理。我完成HTTP连接,然后做更多的工作。这是一个简单的例子:

class AsyncHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(self, *args, **kwargs):
        # first just tell the user to go away
        self.write("Your request is being processed.")
        self.finish()

        # now do work
        ...

我的问题是:这是龙卷风的合法使用吗? self.finish()之后的代码是否可靠运行?我之前从来没有遇到任何问题,但现在我在我的一个开发环境中看到了它的问题(并非所有开发环境)。我已经确定了一些解决方法,但我想确保我不会遗漏Tornado中请求生命周期的基本内容。没有SEEM是我在调用self.finish()之后无法运行代码的原因,但也许我错了。

谢谢!

2 个答案:

答案 0 :(得分:23)

是的,你可以。

您必须定义on_finish的{​​{1}}方法。这是在请求完成后运行的函数,并已将响应发送给客户端。

  

RequestHandler.on_finish()

     

在请求结束后调用。

     

重写此方法以执行清理,日志记录等。此方法是   准备的对应物。 on_finish可能不会产生任何输出,因为它   在将响应发送给客户端后调用。

答案 1 :(得分:4)

是的,self.finish()之后的代码可以正常运行。但你不能两次调用self.finish() - 它会引发异常。在服务器上的所有工作完成之前,您可以使用self.finish()关闭连接。

但正如科尔麦克莱恩所说 - 完成后不要做繁重的工作。 寻找另一种在后台执行繁重任务的方法。