我的代码使用 matplotlib ,这需要花费一两秒才能加载(似乎)。问题在于,当我向Gunicorn发送kill -HUP <pid>
时,对Gunicorn的下一个请求会在请求时加载实际代码,这需要一两秒钟。
我不想强迫用户等一两秒钟。我一直在用urllib2.urlopen()
点击网站并强制某些实例加载代码,但我无法保证所有工作人员都加载了代码。
如何处理后端在请求时加载代码与启动时的代码?我是否将令人讨厌的慢速加载模块放入了settings.py?
答案 0 :(得分:4)
Gunicorn有一些非常棒的配置。正在浏览他们的源代码的git克隆,并找到了一个带有“post_fork”的example_config.py让我思考。在对源进行了一些探讨之后,我想出了这个解决方案。
% 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解决了这个问题
答案 1 :(得分:0)
这听起来像是由于Django在某些模块上的延迟导入。我要么使用settings.py,要么使用特定应用程序的urls.py,以便在工作人员启动时将其导入。