Flask中的Websockets

rui*_*eco 45 python websocket gevent flask uwsgi

我目前正在研究Python中的websocket支持,并且对这些产品感到有些困惑.

一方面可以使用Flask + gevent.另一方面,uwsgi有socket支持,最后有一个扩展包括uwsgi和gevent.

实现仅包含其中一个的websockets有什么问题?混合它们我会赢得什么?

改变问题

添加gevent做什么线程uwsgi不会?

Mig*_*uel 100

在常规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的包装.该烧瓶SocketIO后缀(我是作者无耻插头)是GEVENT和GEVENT-socketio在服务器上的包装,加上Socket.IO客户端上.Socket.IO是更高级别的套接字协议,如果可用,可以使用Web套接字,但也可以在旧版浏览器上使用其他传输机制.

我希望这有帮助!