我可以在Gunicorn下使用gevent-socketio和Flask一起运行,同时仍然享受Flask提供的良好的异常打印、调试器和重载功能吗?我的gunicorn worker和WSGI应用程序类看起来会是什么样子?
发布于 2012-11-30 18:37:38
我遇到了完全相同的问题,所以我使用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_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从这一点开始,项目中的每个更改都应该重新加载所有内容。这有点复杂,但由于gunicorn与worker (或内置的socketio-server)没有任何重载功能,我不得不这样做。
与其他答案中的装饰器解决方案相比,这是一种不同的方法,但我喜欢保持开发特定解决方案的实际代码干净。两者都完成了相同的任务,所以我想您只能选择您喜欢的解决方案。:)
哦,作为额外的好处,您可以在开发中使用生产服务器,这意味着这两个环境彼此匹配。
发布于 2012-11-30 18:30:43
我最近一直在研究这个问题。我不认为你可以通过Flask + gevent-socket.io + Gunicorn轻松地使用自动加载功能。Gunicorn是一个生产服务器,它本身就不允许这样的功能。
但是,我为我的开发服务器找到了一个很好的解决方案:随库提供的user和一个用于自动重新加载的SocketIOServer片段。下面是启动脚本(runserver.py):
from myapp import app
from gevent import monkey
from socketio.server import SocketIOServer
import werkzeug.serving
# necessary for autoreload (at least)
monkey.patch_all()
PORT = 5000
@werkzeug.serving.run_with_reloader
def runServer():
print 'Listening on %s...' % PORT
ws = SocketIOServer(('0.0.0.0', PORT), app, resource="socket.io", policy_server=False)
ws.serve_forever()
runServer()此解决方案的灵感来自:http://flask.pocoo.org/snippets/34/
发布于 2013-09-29 22:59:13
我对Werkzeug调试器做了一些调整,现在它可以与socket.io名称空间一起工作,请参见下面的内容并享受:)
https://stackoverflow.com/questions/13551050
复制相似问题