返回后请求处理程序中的龙卷风流程数据

kef*_*hou 8 python tornado

在龙卷风请求处理程序中,如果我必须调用函数foo()而不影响返回给用户的内容,则首先将结果返回给用户然后调用foo()是有意义的.龙卷风(或使用某些第三方包装)是否可以轻松完成此操作?

A. *_*vis 10

这非常简单:

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

  • 是的,如果foo()阻止了IO.不,如果foo()没有.经验法则:如果foo()使用IOStream,则它是非阻塞的.如果它使用没有IOStream的套接字,那么它就是阻塞的. (2认同)

Sch*_*jer 5

ioloop.add_callback,Tornado将在下一次IOLoop迭代中执行回调.


Pet*_*son -2

不,开箱即用并不“容易”。你指的是“即发即忘”。即使您使用线程池来分配请求,该线程池也将属于 Tornado 的主 python 进程。

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