为什么Python Web服务器不稳定?

时间:2013-10-08 09:02:09

标签: python sockets webserver wsgi

我正在使用Python开发基于HTTP服务器的游戏。计划是尽可能减少依赖关系,所以我希望它能够在不安装独立的Web服务器(如Apache,Lighttpd或nginx)的情况下工作。问题是,它不起作用。

我尝试了以下版本:

  • BaseHTTPServer.HTTPServer(+ SocketServer.ThreadingMixIn)
  • wsgiref.simple_server
  • twisted.web.server

当处于重负荷(siege -b -c 100 -t 30s)时,它们都会部分失败,无论是

[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer

[error] socket: -1313092800 address is unavailable.: Cannot assign requested address

部分地我的意思是:有些请求被提供,有些则没有。

另一方面,当我尝试使用Lighttpd + Flask(即WSGI)甚至Lighttpd + PHP(仅作为控制案例)时,它的工作原理非常好。可用性100%,并发100%。

由于后面的工作版本,我认为问题不是siege,或运行siege和同一台机器上的服务器,或者机器本身(顺便说一下Ubuntu 12.04)。 / p>

注意:在所有情况下,我都测试了简单的“hello world”服务器,以尽量减少错误的可能性。

所以我的两个问题:

  1. 为什么是Python网络服务器不稳定? (究竟什么是原因,而不是解决方案?)
  2. 使用独立的网络服务器+ Python是唯一/最佳解决方案(如果我坚持使用Python),还是我错过了什么?

1 个答案:

答案 0 :(得分:2)

  

所以我的两个问题:   为什么Python Web服务器不稳定? (究竟是什么原因,而不是解决方案?)

这里的问题是 unstable 这个词。 您已达到服务器进程的实现限制。这并不一定意味着它不稳定。 这就像把你的车推到极限。当没有更多的速度你可以获得你会说你的车不稳定吗?

这是“找到合适工作的好工具”的典型问题。 一件事是应用程序服务器,另一件事是服务大量请求和处理连接池。后者是由(web)服务器处理的任务,如nginx,lighttpd,apache,uwsgi,它们是为处理并发和路由而构建的。

详细地说,您尝试的服务器是为处理最大量的请求而构建的。达到该限制后,他们会断开连接。它们不是为了以后对连接进行排队而构建的。

如果您从未尝试过,请查看Tornado,这对游戏服务器有用。

  

使用独立的webserver + Python是唯一/最佳解决方案(如果我坚持使用Python),还是我错过了什么?

是。这是最好的解决方案,而不仅仅是Python。这是一种常见的设计模式。即使在Ruby,PHP,Java中也会看到相同的方法。 最常见的任务是跨应用程序服务器群集分配负载。

典型的环境是:

USER -> BALANCER (nginx,apache,ecc) -> APPSERVER (uwsgi, twisted, gunicorn, ..) -> WSGI Application
相关问题