如何在基于 Python Klein 的 Web 服务中使用多核

How to use multiple core with a webservice based on Python Klein

我正在编写基于 Klein 框架的 Web 服务

https://klein.readthedocs.io/en/latest/index.html

现阶段我正在对我的服务进行压力测试,它可以在亚马逊 t2.medium 实例上每秒处理大约 70 个请求。但是当我使用 top 检查服务器时,它只使用了 CPU 的 100%。我认为亚马逊 t2.medium 实例应该有 2 个 cpu,所以我想知道是否有一种方法可以更改我的 Web 服务代码以使用所有可能的 cpu 并希望处理更多请求。

我已阅读 python 文档并找到了 multiprocessing 模块,但我不确定这是否是正确的解决方案。现在我的网络服务的主要功能是

APP = Klein()
if __name__ == "__main__":
    APP.run("0.0.0.0", SERVER_PORT)

是否有直接的修复方法使该服务能够使用多个 cpu 来处理传入的请求?感谢您阅读这个问题。

当然可以使用 multiprocessing,而且确实很容易启动进程。

from multiprocessing import Process
from klein import Klein

def runserver(interface, port, logFile):
    app = Klein()
    @app.route('/')
    def heyEarth(request):
        return 'Hey Earth!'
    app.run(interface, port, logFile)

process_list = []
for x, port in enumerate([8000, 8001, 8002, 8003]):
    logfilename = open('localhost' + str(port) + '.log', 'a')
    process_list.append(Process(target=runserver, args=('localhost', port, logfilename)))
    process_list[x].daemon = True
    process_list[x].start()

process_list.pop().join()

在企业环境中,运行 在像 nginx 这样的专用负载均衡器后面更好更可靠。所以上面的代码片段应该只用于启动网络服务器,然后你所有的负载平衡应该由一个专用的负载平衡器来处理。

将多进程代码保持在最低限度,否则诸如调试和共享系统文件之类的基本事情开始变得烦人。这就是 "normal" 的问题,可能会出现大量的异常情况,但没有人能够帮助您,因为您自己也不知道发生了什么。只是 运行 在这个片段中,我注意到信号和 Twisted 有一些奇怪的东西。我认为如果我 运行 所有 klein 导入到 runserver().

了解情况,从别人的错误中吸取教训,听取那些被 multiprocessing 烧毁的人的警告,然后去开发一个很棒的应用程序!希望这有帮助 :D

参考资料

  • Tornado: Running and Deploying - 这是一个 Tornado 文档,但它应该仍然有帮助
  • Multicore TwistedWeb - 这是核心开发人员对多进程的 "Twisted" 方法。任何想要 运行 Twisted 和 spawn 过程的人都值得一读。