Python 返回后请求处理程序中的Tornado进程数据

Python 返回后请求处理程序中的Tornado进程数据,python,tornado,Python,Tornado,在tornado请求处理程序中,如果我必须调用不影响返回给用户的内容的函数foo(),那么首先将结果返回给用户,然后调用foo()是有意义的。在tornado中(或使用某些第三方软件包)是否可以轻松实现这一点?ioloop.add\u回调,tornado将在下一次ioloop迭代中执行回调 不,这不是开箱即用的“简单”。你指的是“开火然后忘记”。即使您使用一个线程池来分发请求,该线程池也将属于属于Tornado的主python进程 最好的方法是消息队列。胡萝卜之类的东西。这样,假设您有一个页面,

在tornado请求处理程序中,如果我必须调用不影响返回给用户的内容的函数foo(),那么首先将结果返回给用户,然后调用foo()是有意义的。在tornado中(或使用某些第三方软件包)是否可以轻松实现这一点?

ioloop.add\u回调,tornado将在下一次ioloop迭代中执行回调

不,这不是开箱即用的“简单”。你指的是“开火然后忘记”。即使您使用一个线程池来分发请求,该线程池也将属于属于Tornado的主python进程


最好的方法是消息队列。胡萝卜之类的东西。这样,假设您有一个页面,用户可以在其中执行以开始生成一个巨大的报告,您可以在消息队列中启动它,然后完成Tornado请求,使用一些AJAX魔术和其他技巧(Tornado的范围之外),您可以坐下来等待消息队列完成它的工作(从技术上讲,这可能发生在位于不同物理位置的分布式服务器上)。

错误建议警告:您可以使用多处理

请注意关闭所有数据库连接(在生成的代码中),并在tornado正常完成请求而不使用子进程时执行其他操作。其他答案听起来更好。但是,您可以这样做。不要这样做。

非常简单:

class Handler(tornado.web.RequestHandler):
    def get(self):
        self.write('response')
        self.finish() # Connection is now closed
        foo()

这非常简单;我将添加一个答案。这会阻止io循环吗?是的,如果foo()阻止io。否,如果foo()不阻止io。经验法则:如果foo()使用IOStream则是非阻塞的。如果它使用没有IOStream的套接字,则是阻塞的。这种方法的问题是,如果foo()需要一个正在进行的DB事务,那么在调用self.finish()时,DB会话将出错。