3

私のコードはmatplotlibを使用しており、ロードには1〜2秒かかります(そうです)。問題は、Gunicornに送信kill -HUP <pid>するときに、Gunicornへの次のリクエストがリクエスト時に実際のコードをロードすることです。これには1〜2秒かかります。

ユーザーにその1、2秒待たせたくありません。私はウェブサイトにアクセスしurllib2.urlopen()て、いくつかのインスタンスにコードをロードするように強制して遊んでいますが、すべてのワーカーがコードをロードしたことを保証することはできません。

リクエスト時にコードをロードするバックエンドと、コードが開始されたときのバックエンドを回避するにはどうすればよいですか?問題のある低速読み込みモジュールをsettings.pyに配置しますか?

4

2 に答える 2

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 でこの問題が修正されました

于 2011-03-08T21:57:13.903 に答える
0

これは、一部のモジュールでの Django の遅延インポートが原因のようです。ワーカーの起動時にそれらをインポートするには、settings.py または特定のアプリの urls.py を使用します。

于 2011-03-08T21:22:18.820 に答える