Gunicorn, Django и код медленной загрузки ...? - PullRequest
2 голосов
/ 08 марта 2011

В моем коде используется matplotlib , загрузка которого занимает хорошие секунды или две (кажется).Проблема заключается в том, что когда я отправляю kill -HUP <pid> в Gunicorn, следующий запрос в Gunicorn загружает реальный код во время запроса, что занимает хорошие секунды или две.

Я бы не хотел заставлять пользователяподожди секунду или две.Я играл с веб-сайтом urllib2.urlopen() и заставлял некоторые экземпляры загружать код, но я не могу гарантировать, что все работники загрузили код.

Как я могу работать с бэкэндом, загружая кодкод во время запроса против, когда он начался?Я помещаю нарушающие медленные модули загрузки в settings.py?

Ответы [ 2 ]

4 голосов
/ 09 марта 2011

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

Надеюсь, что это поможет кому-нибудь из Google найти эту подсказку.

Довольно круто, что Gunicorn был достаточно гибок, чтобы учесть это!

ОБНОВЛЕНИЕ: обновленный код, простая загрузка модулей в настройках иногда прерывается из-за того, как django загружает модули, я полагаю ... эта новая обезьяна кода исправляет gunicorn для загрузки модулей в «безопасное» время .. надеюсь

ОБНОВЛЕНИЕ: gunicorn 0.12.1 решает эту проблему

0 голосов
/ 09 марта 2011

Похоже, это связано с задержкой импорта Django в некоторые модули.Я бы либо воспользовался settings.py, либо, возможно, специальным приложением urls.py, чтобы импортировать их при загрузке рабочего.

...