Python HTTP服务器支持多个请求

2 投票
3 回答
5020 浏览
提问于 2025-04-17 03:33

我最近在研究BaseHTTPServer,发现它在处理多个请求时表现得不是很好。我看了一篇文章,里面讲了如何用工作进程和套接字复制来扩展Python服务器,地址是http://metachris.org/2011/01/scaling-python-servers-with-worker-processes-and-socket-duplication/#python

我想知道,建立一个能够处理多个请求的HTTP服务器的最佳方法是什么。

我对HTTP服务器的要求很简单:

  • 支持多个请求(每个请求可能会运行一个很长的Python脚本)

到目前为止,我有以下几个选择:

  • BaseHTTPServer(用线程处理不好)
  • Mod_Python(与Apache集成)
  • CherryPy?
  • 还有其他选择吗?

3 个回答

1

Tornado 是一个非常好用的异步事件循环和网络服务器,由 FriendFeed/Facebook 开发。个人使用过,体验非常不错。你可以像下面的例子那样使用 HTTP 类,或者只用 io-loop 来处理普通的 TCP 连接。

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.current().start()
1

确实,标准的Python库里提供的HTTP服务器只适合轻量级的使用。如果你的需求是中等规模,比如同时处理几百个连接,mod_wsgi在Apache服务器中是个不错的选择。

如果你的需求更高,比如需要同时处理上万个连接,那你就需要考虑使用异步框架,比如Twisted或Tornado。异步应用的整体结构和普通应用差别很大,所以如果你觉得将来可能需要走这条路,最好从一开始就选择这些框架来启动你的项目。

2

我在使用CherryPy这个网络服务器时运气很好。它是最古老、最稳定的纯Python网络服务器之一。只要把你的应用程序写成一个WSGI可调用的格式,就可以很容易地在CherryPy的多线程服务器上运行。

http://www.cherrypy.org/

撰写回答