我目前正在研究Python中的websocket支持,并且对这些产品感到有些困惑。
一方面可以使用Flask + gevent。另一方面,uwsgi有socket support,最后有一个扩展捆绑了uwsgi and gevent。
实现仅包含其中一个的websockets有什么问题?混合它们我能赢得什么?
更改问题
添加gevent做什么线程uwsgi不会?
答案 0 :(得分:87)
在常规HTTP请求中,客户端和服务器之间的连接是短暂的,客户端连接到服务器,发送请求,接收响应然后关闭连接。在此模型中,服务器可以使用少量工作人员为大量客户端提供服务。这种情况下的并发模型通常基于线程,进程或两者的组合。
当你使用websocket时问题更复杂,因为websocket连接长时间打开,所以服务器不能使用一小群工人来服务大量客户端,每个客户端需要得到它拥有专职工作者。如果您使用线程和/或进程,那么您的应用程序将无法扩展以支持大量客户端,因为您无法拥有大量线程/进程。
这是gevent进入画面的地方。 Gevent有一个基于greenlets的并发模型,它比线程/进程更好地扩展。因此,由于greenlet的轻量级特性,使用基于gevent的服务器提供websocket连接可以支持更多客户端。使用uWSGI,您可以选择与Web套接字一起使用的并发模型,其中包括gevent的基于greenlet的模型。如果需要,您也可以单独使用gevent的Web服务器。
但请注意,gevent对Web套接字一无所知,它只是一个服务器。要使用websocket连接,您必须添加websocket服务器的实现。
Flask有两个扩展,可以简化websockets的使用。 Kenneth Reitz的Flask-Sockets扩展是gevent和gevent-websocket的包装器。 Flask-SocketIO扩展名(无耻插件,因为我是作者)是服务器上的gevent和gevent-socketio的包装器,以及客户端上的Socket.IO。 Socket.IO是更高级别的套接字协议,可以使用Web套接字(如果可用),但也可以在旧浏览器上使用其他传输机制。
我希望这有帮助!