Socket.io gevent socketio+;烧瓶+;古尼科恩

Socket.io gevent socketio+;烧瓶+;古尼科恩,socket.io,flask,gevent,gunicorn,Socket.io,Flask,Gevent,Gunicorn,我可以将gevent socketio与Flask一起使用,在Gunicorn下运行,并且仍然可以享受Flask提供的良好的异常打印、调试器和重新加载功能吗?我的gunicorn worker和WSGI应用程序类会是什么样子?我最近一直在研究这个主题。我认为您不能轻松地将自动加载功能与Flask+gevent-socket.io+Gunicorn一起使用。Gunicorn是一个生产服务器,不允许以本机方式使用此类功能 然而,我为我的开发服务器找到了一个很好的解决方案:随库提供的用户SocketI

我可以将gevent socketio与Flask一起使用,在Gunicorn下运行,并且仍然可以享受Flask提供的良好的异常打印、调试器和重新加载功能吗?我的gunicorn worker和WSGI应用程序类会是什么样子?

我最近一直在研究这个主题。我认为您不能轻松地将自动加载功能与Flask+gevent-socket.io+Gunicorn一起使用。Gunicorn是一个生产服务器,不允许以本机方式使用此类功能

然而,我为我的开发服务器找到了一个很好的解决方案:随库提供的用户SocketIOServer和一个用于autoreload的Flask片段。以下是启动脚本(runserver.py):


此解决方案的灵感来自:

我遇到了完全相同的问题,所以我使用watchdog解决了它

pip install watchdog
与此命令一起:

watchmedo shell-command --patterns="*.py*;;*.less;*.css;*.js;*.txt;*.html" --recursive --command='kill -HUP `cat /tmp/gunicorn.pid` && echo "Reloading code" >> /tmp/gunicorn.log' ~/projectfolder
它需要(嗯,不是真的,但我将“重新加载代码”指向同一个日志文件,所以这是一件好事)对gunicorn进程进行后台监控,我这样做:

gunicorn\u config.py

workers = 2
worker_class = 'socketio.sgunicorn.GeventSocketIOWorker'
bind = '0.0.0.0:5000'
pidfile = '/tmp/gunicorn.pid'
debug = True
loglevel = 'debug'
errorlog = '/tmp/gunicorn.log'
daemon = True
启动应用程序:

gunicorn run:app -c gunicorn-config.py
查看日志:

tail -f /tmp/gunicorn.log
从这一点开始,项目中的每一个更改都应该重新加载所有内容。 这有点复杂,但由于带有worker的gunicorn(或内置的socketio服务器)没有任何重新加载功能,我不得不这样做

与另一个答案中的decorator解决方案相比,这是一种不同的方法,但我喜欢保持实际代码与特定于开发的解决方案的一致性。两者都能完成相同的任务,因此我想您只需选择您喜欢的解决方案即可。:)


哦,作为一个额外的好处,您可以在开发中使用生产服务器,这意味着两个环境相互匹配。

我对Werkzeug调试器进行了一些调整,因此它现在可以与socket.io名称空间一起使用,请参见下文并欣赏:)


我刚刚注意到,我用这种方法丢失了美丽的werkzeug调试页面。。。查看。编辑答案以包含调试页面。Used werkzeug.debug.DebuggedApplication:坏消息:DebuggedApplication会破坏WebSocket服务:-(删除它。谢谢。我喜欢DebuggedApplication,正因为如此,+1(不关心此特定项目的WebSocket)。然而,重新加载似乎并不顺利——它将重新加载并重新启动Gunicorn,这将创建更多的进程,保留旧进程,因此不允许我重新绑定端口。查看Gunicorn代码后,似乎需要重新启动它时会发生很多事情,正确的方法是使用SIGHUP.Nice.Yo不过,您不需要为此对gunicorn进行后台监控。一个简单的“-p/tmp/gunicorn.pid”足够了,这很好,因为你可以在控制台中看到日志,而且你可以^C停止。我必须承认,出于懒惰的原因,我一开始更喜欢另一个答案。然而,在gunicorn中重新加载需要一个SIGHUP,这似乎是一种足够体面的方式。thoug,我不喜欢在另一个窗口中运行watchmedoh、 实际上,我正在考虑在我的app.py中放一个watchdog.observer(在
\uuuu name\uuuuu=='\uuuuu main\uuuuu'
下,只是为了开发)嗯……将看门狗添加到我的特定项目中是行不通的——我使用的是gevent。我想我必须在另一个过程中完成它。Nitzan,我一直在玩与gunicorn过程一起创建看门狗过程的游戏,但最后我对奇怪的结果感到非常恼火,我只使用了两个窗口。我喜欢daemonized设置,因为你不能使用它同样地关闭它,然后跟踪日志文件的结果与观看标准输出相同:)是的,但不能^c它。。。我还试图通过编写一个会发出sighup的看门狗“技巧”来推广你的想法,我在意识到gevent的事情后放弃了它。但是你可以使用kill-9
/tmp/gunicorn.pid
来关闭它。所有命令都使用简单的别名,这并不是什么麻烦事。我相信当我厌倦的时候,我会改善这种混乱^^
tail -f /tmp/gunicorn.log