使用Python的Websocket-各种选项

时间:2019-05-17 17:45:26

标签: python flask websocket flask-socketio

我已经读过有关Python websockets Library的内容,它实际上对我有用。我特别满意从Web客户端进行连接的标准方式:

var ws = new WebSocket("ws://127.0.0.1:5678/")
ws.onmessage = function (event) ...

无需导入,所有内容都是标准的,并且由现代浏览器提供开箱即用的支持。到目前为止,一切都很好,但是Python应用程序是Flask with Connexion,用于基于swagger.yaml的REST API。 Websockets库不能与Flask / Connexion共享相同的端口。好的,有Flask-socketio库,我可以与Connexion一起运行,并为REST和Websockets提供服务器。但是对我来说,它有几个缺点,我正在寻求您的帮助:

  1. 在客户端上,我被迫使用socketio,因为支持浏览器的WebSocket无法与Flask-socketio一起使用。总是这样,还是我做错了什么(这与问题2有关)。
  2. 到目前为止,我已经成功地在Flask调试模式下运行Flask-socketio(python my_flask_source.py)。我已经阅读了Flask-socketio文档,并且了解到此模式不支持Websocket,仅支持长时间轮询。确实,我看到每隔几秒钟就会收到许多GET / POST请求,这些请求由Flask服务。客户正在使用uWSGI进行生产,但是对于我来说,目前尚不清楚在哪里开始在开发中重现其配置。我对Python还是很陌生,但是通过阅读尽可能多的相关资源,我了解Flask开发服务器是多线程的,这意味着它可以在单个进程中满足许多并行请求。但是看起来uWSGI是单线程的,必须产生许多进程才能实现高吞吐量。此外,还有一些gevent模块:

uwsgi --http:5000 --gevent 1000 --http-websockets --master --wsgi-file app.py --callable app

在uWSGI下将Flask-socketio服务器部署用于生产是否有编写良好的逐步说明? Nginx是否起作用?我将能够在浏览器中使用Websocket,还是仍然可以使用socketio?

1 个答案:

答案 0 :(得分:1)

让我尝试澄清一下:

  1. 如果使用Socket.IO服务器,则必须使用Socket.IO客户端。 Socket.IO与WebSocket不同。

  2. 您正在使用gevent运行uWSGI,因此并发是通过greenlets处理的。 --gevent 1000参数配置1000个并发任务。除非您用完了所有的uWSGI进程,否则您不需要它们就可以生成1000个。

  

在uWSGI下将Flask-socketio服务器部署用于生产是否有编写良好的逐步说明?

我所能提供的是Flask-SocketIO和python-socketio文档。

  

nginx是否起作用?

由您决定,真的。 uWSGI服务器已经可以投入生产,但是将其放置在nginx后面并让nginx终止TLS,提供静态内容等是相当普遍的。

  

我将能够在浏览器中使用Websocket,还是仍然可以使用socketio?

不。见上文。