我的代码使用matplotlib需要一两秒才能加载(似乎)。问题是当我发送kill -HUP <pid>
到 Gunicorn 时,下一个对 Gunicorn 的请求会在请求时加载实际代码,这需要一两秒。
我不想强迫用户等待那一两秒。我一直在尝试访问网站urllib2.urlopen()
并强制某些实例加载代码,但我不能保证所有工作人员都已加载代码。
如何解决在请求时加载代码而不是在其启动时加载代码的后端?我是否将有问题的缓慢加载模块放在 settings.py 中?
Gunicorn 有一些非常棒的配置。正在浏览他们源代码的 git 克隆,发现了一个 example_config.py,它有一个“post_fork”,这让我开始思考。在对源代码进行了一些探索之后,我想出了这个解决方案。
% gunicorn_django -c path/to/gunicorn_conf.py path/to/settings.py
gunicorn_conf.py 有这个功能的地方:
def post_fork(server, worker):
server.log.info("%s: Worker spawned" % worker.pid)
from gunicorn.workers.sync import SyncWorker
class SyncWorkerPreload(SyncWorker):
def run(self):
pass
def init_process(self):
super(SyncWorkerPreload, self).init_process()
from django.db.models.loading import get_apps
get_apps()
server.log.info('%s: App loaded' % self.pid)
super(SyncWorkerPreload, self).run()
worker.__class__ = SyncWorkerPreload
希望能帮助某人在谷歌上找到这个提示。
Gunicorn 足够灵活,可以做到这一点,真是太棒了!
更新:更新的代码,简单地在设置中加载模块有时会由于 django 加载我假设的模块的方式而中断......这个新的代码猴子修补 gunicorn 以在“安全”时间加载模块......希望
更新: gunicorn 0.12.1 修复了这个问题
这听起来确实是由于 Django 在某些模块上延迟导入所致。我要么使用 settings.py,要么使用特定应用程序的 urls.py,以便在工作人员启动时导入它们。