3

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

我不想强迫用户等待那一两秒。我一直在尝试访问网站urllib2.urlopen()并强制某些实例加载代码,但我不能保证所有工作人员都已加载代码。

如何解决在请求时加载代码而不是在其启动时加载代码的后端?我是否将有问题的缓慢加载模块放在 settings.py 中?

4

2 回答 2

4

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 修复了这个问题

于 2011-03-08T21:57:13.903 回答
0

这听起来确实是由于 Django 在某些模块上延迟导入所致。我要么使用 settings.py,要么使用特定应用程序的 urls.py,以便在工作人员启动时导入它们。

于 2011-03-08T21:22:18.820 回答