0

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

我尝试了以下版本:

  • BaseHTTPServer.HTTPServer (+SocketServer.ThreadingMixIn)
  • wsgiref.simple_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)。

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

所以我的两个问题:

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

1 回答 1

2

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

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

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

详细地说,您尝试的服务器旨在处理最大数量的请求。达到该限制后,它们会断开连接。它们不是为了将连接排队以备后用。

如果您从未尝试过,也可以看看Tornado,它对游戏服务器很有用。

使用独立的网络服务器 + Python 是唯一/最好的解决方案(如果我坚持使用 Python),还是我错过了什么?

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

一个典型的环境是:

USER -> BALANCER (nginx,apache,ecc) -> APPSERVER (uwsgi, twisted, gunicorn, ..) -> WSGI Application
于 2013-10-08T10:43:33.047 回答