如何在flask-socketio中同时使用Websocket传输和async_mode = threading?

时间:2019-05-15 20:37:19

标签: socket.io gevent flask-socketio eventlet

我正在设置一个socket.io服务器,我们有几个后台线程调用长的阻塞方法来轮询数据。我们还想从这些线程向socket.io客户端发送数据。我们遇到了这样的问题:这些线程将发出某些东西,并且将它永久地推送到客户端,直到切换到async_mode ='threading'。然后一切正常,除了我们现在得到警告:

WebSocket传输不可用。安装eventlet或gevent和gevent-websocket可以提高性能。

这些模块已安装,但在使用线程模式时不使用。我们如何既可以使后台线程始终运行又不调用socketio.sleep,而又同时使用Websocket传输而不是线程呢?谢谢

1 个答案:

答案 0 :(得分:0)

我是Flask-SocketIO和构建它的Socket.IO服务器的作者。

简短的答案是,您需要有人将对WebSocket的独立支持添加到python-engineio软件包中,这是Flask-SocketIO的核心依赖之一。

这是很长的答案。基于标准线程的WebSocket服务器通常是个坏主意,这就是为什么我从未亲自实现过。 WebSocket服务器要求很高,因为它们需要与每个客户端建立永久连接。如果您有100个已连接的客户端,则需要100个活动连接。在线程服务器中,这意味着您需要100个线程同时运行,并且运行时间很长。不幸的是,您在Python进程中可以拥有的线程数量是有限的。您可能有100个,但可能有1000个挑战。几乎所有WebSocket实现都使用异步服务器,因为这种服务器可以轻松维护大量活动连接。

希望这为您为什么我从未为线程实现WebSocket辩解。话虽如此,对于客户端数量较少的服务器,每个客户端线程可能没问题,因此如果有人决定实施并提供此功能,我愿意添加此功能。