13

我正在使用龙卷风。我有一堆异步请求处理程序。他们中的大多数以异步方式完成工作,然后将工作结果报告给用户。但是我有一个处理程序,他的工作就是简单地告诉用户他们的请求将在将来的某个时间点得到处理。我完成了 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
        ...

我的问题是:这是对 Tornado 的合法使用吗?self.finish() 之后的代码会可靠运行吗?我以前从未遇到过问题,但现在我在我的一个开发环境(不是全部)中看到了它的问题。这里有许多我已经确定的解决方法,但我想确保我没有遗漏 Tornado 中请求生命周期的基本内容。似乎没有理由在调用 self.finish() 后我无法运行代码,但也许我错了。

谢谢!

4

2 回答 2

30

是的你可以。

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

RequestHandler.on_finish()

在请求结束后调用。

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

于 2013-10-22T13:37:40.313 回答
5

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

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

于 2012-10-03T13:11:42.343 回答