在返回后,Tornado处理请求处理器中的数据

8 投票
4 回答
2174 浏览
提问于 2025-04-16 13:30

在一个tornado的请求处理器中,如果我需要调用一个函数foo(),而这个函数的结果对用户返回的内容没有影响,那么我可以先把结果返回给用户,然后再调用foo()。在tornado中,或者用一些第三方包,有没有简单的方法可以做到这一点呢?

4 个回答

5

ioloop.add_callback这个方法是用来告诉Tornado在下一个IOLoop循环中执行某个回调函数的。

12

这非常简单:

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

不,这个事情一开始并不是“简单”的。你提到的“fire and forget”意思是发出请求后就不再管了。即使你使用线程池来处理请求,这个线程池还是属于主Python进程,而这个进程是Tornado的一部分。

最好的方法是使用消息队列。比如说Carrot。这样,如果你有一个页面,用户可以在上面启动生成一个非常大的报告,你就可以把这个任务放到消息队列里,然后结束Tornado的请求。接着,利用一些AJAX的技巧和其他方法(这些不在Tornado的范围内),你就可以轻松等待消息队列完成它的工作(这个工作实际上可能是在不同物理位置的分布式服务器上进行的)。

撰写回答