Websockets in Flask



我目前正在研究Python中的websocket支持,对这些产品有点困惑。

一方面,可以使用烧瓶+gevent。另一方面,uwsgi有套接字支持,最后有一个扩展捆绑了uwsgi和gevent。

只使用其中一个实现websocket有什么问题?混合它们能赢得什么?

更改问题

添加gevent能做什么,而线程化的uwsgi不会做什么?

在常规HTTP请求中,客户端和服务器之间的连接是短暂的,客户端连接到服务器,发送请求,接收响应,然后关闭连接。在该模型中,服务器可以使用少量工作人员为大量客户端提供服务。这种情况下的并发模型通常基于线程、进程或两者的组合。

当你使用websocket时,问题更复杂,因为websocket连接是长时间打开的,所以服务器不能使用一小部分工作人员来为大量客户端服务,每个客户端都需要有自己的专用工作人员。如果你使用线程和/或进程,那么你的应用程序将无法扩展到支持大量客户端,因为你不能拥有大量的线程/进程。

这就是gevent进入画面的地方。Gevent有一个基于greenlets的并发模型,它的伸缩性比线程/进程好得多。因此,由于greenlets的轻量级特性,使用基于gevent的服务器提供websocket连接可以支持更多的客户端。使用uWSGI,您可以选择与web套接字一起使用的并发模型,其中包括gevent中基于greenlet的模型。如果您愿意,也可以使用gevent的独立web服务器。

但请注意,gevent对网络套接字一无所知,它只是一个服务器。要使用websocket连接,您必须添加websocket服务器的实现。

Flask有两个扩展,可以简化websocket的使用。Kenneth Reitz的Flask Sockets扩展是gevent和gevent websocket的包装器。Flask SocketIO扩展(我是作者,无耻的插件)是服务器上gevent和gevent SocketIO以及客户端上Socket.IO的包装器。Socket.IO是一种更高级别的套接字协议,如果可用,它可以使用web套接字,但也可以在旧浏览器上使用其他传输机制。

相关内容

  • 没有找到相关文章

最新更新