Python HTTP服务器支持多个请求
我最近在研究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的多线程服务器上运行。