web2py - 我需要另一台服务器来运行实时应用程序吗?

web2py - do I need another server for a real time application?

在 web2py 示例中有一个使用 tornado 的 websocket 示例:

gluon/contrib/websocket_messaging.py 这需要启动另一个服务器,即 tornado。我的问题是,我需要另一台服务器吗?我应该只有一台服务器来处理 websocket 东西和普通的 http 请求吗?

此外,似乎 tornado 是第二台服务器的首选服务器,这会有所不同吗?

我是 websockets(和 webapp 开发)的新手,所以任何 comments/links 可以帮助我更好地理解这一点的人都将不胜感激。

Python 基于 WSGI 的框架(例如 web2py)通常通过线程 Web 服务器提供服务。一个典型的 HTTP 请求只会非常短暂地占用一个服务器线程,以便接收传入请求并传递响应,然后释放该线程来处理另一个传入请求。

另一方面,Websockets(和长轮询)需要客户端(即浏览器)和 Web 服务器之间的长期连接。 websocket 连接因此会无限期地占用一个线程,所以你只能有多少个线程就有多少个连接,从而将应用程序限制在相对较少的并发用户数。

为了同时启用多个 websocket 连接,因此最好通过具有非阻塞网络 I/O 的服务器来为 websocket 提供服务,例如 Tornado。有关详细信息,请参阅 http://www.tornadoweb.org/en/stable/guide/async.html

另一种选择是使用 Gevent with monkey patching, which can be used in the context of a WSGI application as described here。不过请记住,您使用的任何涉及网络 I/O 的库(例如数据库驱动程序)都必须与此方法兼容(通过猴子修补或明确为协程设计的代码)。

如果 realtime/server-push 功能是您应用程序的主要方面,尤其是如果您不熟悉 Web 开发,则可以考虑为该特定用例构建一个框架,例如 Meteor .