Gunicorn,Django和慢速加载代码......?

时间:2011-03-08 20:56:29

标签: django gunicorn

我的代码使用 matplotlib ,这需要花费一两秒才能加载(似乎)。问题在于,当我向Gunicorn发送kill -HUP <pid>时,对Gunicorn的下一个请求会在请求时加载实际代码,这需要一两秒钟。

我不想强迫用户等一两秒钟。我一直在用urllib2.urlopen()点击网站并强制某些实例加载代码,但我无法保证所有工作人员都加载了代码。

如何处理后端在请求时加载代码与启动时的代码?我是否将令人讨厌的慢速加载模块放入了settings.py?

2 个答案:

答案 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,以便在工作人员启动时将其导入。