如何将多核与基于Python Klein的Web服务一起使用

时间:2016-09-07 19:40:36

标签: python multithreading web-services twisted klein-mvc

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

当然可以使用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等专用负载均衡器后面运行会更好,更可靠。因此,上面的代码片段只应用于启动Web服务器,然后所有负载均衡应由专用负载均衡器处理。

将多进程代码保持在最低限度,否则调试和共享系统文件等基本内容就会变得烦恼。这就是“正常”的东西,有很多异常可能出现,没有人能够帮助你,因为你不知道自己发生了什么。只是运行这个片段,我注意到一些奇怪的信号和扭曲的东西。如果我在klein中运行所有runserver()次导入,我认为可以修复。

了解情况,从其他错误中吸取教训,留意那些被multiprocessing焚烧的人的警告,然后去做一个踢屁股的应用!希望这会有所帮助:D

参考