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

Dan*_* K. 12 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
        ...
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

var*_*tec 24

是的你可以.

你必须定义on_finish你的方法RequestHandler.这是在请求完成后运行并将响应发送到客户端的函数.

RequestHandler.on_finish()

在请求结束后调用.

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


Nik*_*nyh 5

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

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