在返回后,Tornado处理请求处理器中的数据
在一个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的范围内),你就可以轻松等待消息队列完成它的工作(这个工作实际上可能是在不同物理位置的分布式服务器上进行的)。