Gunicorn 不重新加载 Django 应用程序
我在使用Django 1.3和gunicorn 0.12.1的应用时,遇到了代码重载不一致的问题,这个应用是在虚拟环境中运行的。
即使我重启了特定的gunicorn进程,gunicorn也没有正确地重新加载我的应用。当我通过Django的manage.py
命令运行基本的runserver
时,这个问题就不存在了。
当我删除并重新创建我的虚拟环境时,gunicorn就能正常运行新代码了。
是不是有Python缓存之类的东西?我也尝试过删除所有的*.pyc
文件。
2 个回答
4
我也遇到过类似的问题。根据Pokomy先生链接的文章,使用HUP
信号来结束gunicorn主进程似乎能解决这个问题。
如果你使用python的watchdog
模块,可以很容易地设置在保存文件时自动重载。这个设置其实挺简单明了的,下面是我开发时用的supervisord.conf文件中的一段代码:
[program:ost2]
autostart=true
command=/usr/local/share/python/gunicorn --debug\
-c /Users/fish/Dropbox/ost2/ost2/utils/gunicorn/ost2-debug.py wsgi_debug
directory=/Users/fish/Dropbox/ost2/ost2
priority=500
; (etc)
[program:ost2-reloader]
autostart=true
autorestart=false
directory=/tmp
command=/usr/local/share/python/watchmedo shell-command\
--patterns="*.py;*.txt;*.html;*.css;*.less;*.js;*.coffee"\
-R --command='kill -HUP $(cat /usr/local/gunicorn/gunicorn.pid)'\
/Users/fish/Dropbox/ost2/ost2/
priority=996
; (etc)
(注意:我在示例中加了斜杠在换行符前,这些换行符在配置文件中并不存在——我加这些换行符是为了让内容更清晰;我不确定在实际操作中这样是否有效)
第一个程序是gunicorn进程,我在开发时用单线程运行它,这样可以使用Werkzeug调试器。第二部分是比较有意思的:这个命令的意思是“每当这个目录树中的文件有变化时,如果文件后缀在这个列表中,就结束由gunicorn PID文件指定的进程”。
这个方法对很多人,包括我自己,都非常有效。如果你还不知道watchdog
,它非常有用,值得一试。
7