【问题标题】:Python tornado web server: How to use multiprocessing to speed up web applicationPython Tornado Web 服务器:如何使用多处理来加速 Web 应用程序
【发布时间】:2015-11-23 06:40:49
【问题描述】:

我有一个 Web 应用程序在一个用户使用时运行良好,但随着越来越多的客户开始使用它,它的速度慢得令人难以忍受。服务器端是用python编写的,使用tornado。我注意到虽然它运行的服务器有 4 个内核,但只使用了 1 个内核,所以我开始研究 python 的多处理。我从http://sebastianraschka.com/Articles/2014_multiprocessing_intro.html 看到了基本示例,从以下位置看到了龙卷风处理器: http://tornado.readthedocs.org/en/latest/_modules/tornado/process.html(看起来有点复杂),但我仍然不确定这是我要找的。当说 50 个用户同时查看它时,用 4 个处理器运行这段代码会加快速度吗?如果是这样的话,这些选项之一是使用 Tornado Web 服务器时的实施方式吗?

对于这个含糊不清且写得不好的问题,我深表歉意——即使经过广泛研究,我也缺乏多处理方面的经验。如果任何示例代码有助于回答这个问题,请告诉我。

谢谢!

【问题讨论】:

    标签: python web server multiprocessing tornado


    【解决方案1】:

    您可以使用这样的代码运行多个 tornado worker:

    import tornado.web
    import tornado.httpserver
    import tornado.ioloop
    
    class MyHandler(tornado.web.RequestHandler):
    
        @tornado.web.asynchronous
        def get(self):
            self.write('OK')
            self.finish()
    
    if __name__=='__main__':
        app = tornado.web.Application([(r'/', MyHandler)])
    
        server = tornado.httpserver.HTTPServer(app)
        server.bind(8888)
    
        server.start(4) # Specify number of subprocesses
    
        tornado.ioloop.IOLoop.current().start()
    

    尽管您的应用在为 50 个用户提供服务时出现问题,即使在一个内核上也存在问题,这很奇怪。您是否有一些繁重的计算,或者您是否使用了任何阻塞库?

    确保在处理程序方法上使用 @tornado.web.asynchronous@tornado.gen.coroutine 装饰器,否则您只是在同步运行代码。

    更新:为了在单独的进程中完成繁重的工作,您可以使用concurrent.futures.ProcessPoolExecutor。看看这个答案:https://stackoverflow.com/a/25208213/1525432

    【讨论】:

    • 非常感谢示例代码,我确实有协程装饰器。是的,有一些我没有写的繁重计算,所以这种行为在某种程度上是意料之中的。对具有所有数学和计算的函数使用多处理会有什么好处吗?
    • 肯定应该有。如果您有 4 个内核,则可以启动 4 个进程并获得 4 倍的请求吞吐量,但如果您的任务是 CPU 密集型,则不会更多。
    • 太好了,谢谢,还有一个问题。我们有一个共享 python 脚本用于启动我无法更改的所有应用程序,这就是 tornado.ioloop.IOLoop.current().start() 代码所在的位置,所以我无法编辑有多少子进程采用。如果我在我的独立服务器代码中添加进程,例如 process = multiprocessing.Process(..),而不指定“server.start(4)”,这就足够了吗?
    猜你喜欢
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多