【问题标题】:Tornado process data in request handler after return返回后请求处理程序中的 Tornado 过程数据
【发布时间】:2011-03-11 15:21:19
【问题描述】:

在龙卷风请求处理程序中,如果我必须调用不影响返回给用户的函数 foo(),则首先将结果返回给用户然后调用 foo() 是有意义的。是否有可能在龙卷风中轻松做到这一点(或使用一些第三方包)?

【问题讨论】:

    标签: python tornado


    【解决方案1】:

    非常简单:

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

    【讨论】:

    • 这会阻塞io循环吗?
    • 是的,如果 foo() 确实阻塞了 IO。不,如果 foo() 没有。经验法则:如果 foo() 使用 IOStream 那么它是非阻塞的。如果它使用没有 IOStream 的套接字,那么它就是阻塞的。
    • 这种方法的问题是,如果你有一个正在进行的数据库事务,这将需要 foo() ,那么在你调用 self.finish() 的那一刻,数据库会话就会被搞砸。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      坏建议警告:您可以使用多处理。

      http://docs.python.org/library/multiprocessing.html

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

      【讨论】:

        【解决方案4】:

        不,开箱即用并不“简单”。您指的是“一劳永逸”。即使您使用线程池来分出请求,该线程池也将属于属于 Tornado 的主要 python 进程。

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

        【讨论】:

        • 非常简单;我会添加一个答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-12
        • 2013-07-20
        • 1970-01-01
        • 2023-03-10
        • 2017-01-31
        • 2011-06-23
        • 2011-12-31
        相关资源
        最近更新 更多