龙卷风:我可以在异步调用RequestHandler self.finish()之后运行代码?(To

2019-08-01 02:46发布

我使用的是龙卷风。 我有一大堆的异步请求处理程序。 他们中的大多数做他们的工作异步,然后是工作的结果报告给用户。 但我有一个处理程序的工作就是简单地告诉他们的要求是要在未来的某一时刻要处理的用户。 我完成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()后的代码运行可靠? 我从来没有与它有一个问题,但现在我在我的开发环境,一个看到一个与它的问题(不是全部)。 有许多在这里的变通办法,我已经明确了,但我要确保我不会失去了一些东西在龙卷风请求生命周期的基础。 虽然目前没有似乎是一个原因,我将无法调用self.finish()后运行代码,但也许我错了。

谢谢!

Answer 1:

是的你可以。

你必须定义on_finish你的方法RequestHandler 。 这是运行后的请求完成,并已发送到客户机的响应的功能。

RequestHandler.on_finish()

的请求的结束之后被调用。

覆盖此方法来执行清理,日志记录等,这方法是制备一个对应。 on_finish可能不会产生任何输出,作为响应已经被发送到客户端之后被调用。



Answer 2:

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

但正如科尔麦克林告诉 - 做完后不要干重活。 寻找另一种方式做繁重的任务在后台。



文章来源: Tornado: Can I run code after calling self.finish() in an asynchronous RequestHandler?