Flask中的Websockets

70
我正在研究Python中的Websocket支持,并对所提供的内容感到有些困惑。
一方面,可以使用Flask + gevent。另一方面,uwsgi具有socket支持,最后还有一个扩展程序将uwsgi和gevent捆绑在一起。
只使用其中一个实现Websockets存在什么问题?混合使用它们会带来什么好处? 修改问题 添加gevent相比线程化的uwsgi有哪些优势?

有一个由Kenneth Reitz编写的扩展名为“Flask-Sockets”,非常适合Websockets。看一下这个链接:https://github.com/kennethreitz/flask-sockets - codegeek
3
谢谢,但我也对了解gevent在这个混乱中扮演的角色很感兴趣。 - ruipacheco
我认为这是因为它是异步的。因此,单个工作线程不会仅处理一个客户端。 - Joe Doherty
1个回答

156
在常规的HTTP请求中,客户端和服务器之间的连接是短暂的,客户端连接到服务器,发送请求,接收响应,然后关闭连接。在这种模型中,服务器可以使用少量的工作线程为大量客户端提供服务。在这种情况下,并发模型通常基于线程、进程或两者的组合。
当使用WebSocket时,问题更加复杂,因为WebSocket连接打开时间很长,所以服务器不能使用少量的工作线程为大量客户端提供服务,每个客户端都需要获得自己的专用工作线程。如果使用线程和/或进程,则您的应用程序将无法扩展以支持大量客户端,因为您无法拥有大量的线程/进程。
这就是gevent的作用。Gevent具有基于greenlets的并发模型,比线程/进程更好地扩展。因此,使用基于gevent的服务器为WebSocket连接提供服务允许您支持更多客户端,由于greenlets的轻量级特性。使用uWSGI,您可以选择与WebSockets一起使用的并发模型,包括来自gevent的基于greenlet的模型。您还可以使用gevent的Web服务器独立运行。
但请注意,gevent不知道任何关于WebSocket的信息,它只是一个服务器。要使用WebSocket连接,您必须添加WebSocket服务器的实现。

有两个Flask的扩展可以简化使用Websockets。Kenneth Reitz的Flask-Sockets扩展是gevent和gevent-websocket的包装器。Flask-SocketIO扩展(我是作者,无耻的自荐)是服务器上gevent和gevent-socketio的包装器,加上客户端上的Socket.IO。Socket.IO是更高级的套接字协议,如果可用,可以使用Web socket,但也可以在旧版浏览器上使用其他传输机制。


@Miguel - 如果我正在使用管理器,该如何运行Socket.IO?无法执行预定的操作 - socketio.run(app) - vivekanon
如果我需要在 Flask 中监听来自几个不同 API 的 socket 连接,应该怎么做呢?使用 Celery?线程?进程池? - PirateApp
为什么在讨论WebSockets的问题时,你要把人们推向Socket.IO呢?看起来你把广告硬塞到了不相关的事情上。 - Peilonrayz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接