Как запустить Load Data, когда приложение Django запускается через сервер gunicorn? - PullRequest
0 голосов
/ 10 апреля 2019

Для настройки производства: 1) Я сталкиваюсь с такой проблемой, как приложение Django не инициализируется (не загружает данные в память) при запуске сервера Gunicorn.Когда приходит первый запрос, все эти данные загружаются в память.Загрузка занимает некоторое время, в то время как получен тайм-аут запроса об ошибке.

2) Когда приходит каждый запрос, новый работник запускает его, загружает набор данных в память и сервер зависает.

Я пыталсяизменить рабочий_класс с «асинхронного» на «gthread», но все еще сталкиваюсь с той же проблемой.

добавить pre_load = True // без улучшений

File name gunicorn_config.py



workers = 2
worker_class = 'gthread'
worker_connections = 1000
timeout = 30000
keepalive = 2

preload_app = True

spew = False


daemon = False
raw_env = [
    'DJANGO_SECRET_KEY=something',
    'SPAM=eggs',
]
pidfile = None
umask = 0
user = None
group = None
tmp_upload_dir = None


errorlog = '-'
loglevel = 'info'
accesslog = '-'
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'

proc_name = None

def post_fork(server, worker):
    server.log.info("Worker spawned (pid: %s)", worker.pid)

    from gunicorn.workers.sync import SyncWorker
    class SyncWorkerPreload(SyncWorker):
        def run(self):
            pass

        def init_process(self):
            super(SyncWorkerPreload, self).init_process()
            import django
            django.setup()

            server.log.info('%s: App loaded' % self.pid)
            super(SyncWorkerPreload, self).run()

    worker.__class__ = SyncWorkerPreload


def pre_fork(server, worker):
    pass

def pre_exec(server):
    server.log.info("Forked child, re-executing.")

def when_ready(server):
    server.log.info("Server is ready. Spawning workers")

def worker_int(worker):
    worker.log.info("worker received INT or QUIT signal")

    ## get traceback info
    import threading, sys, traceback
    id2name = {th.ident: th.name for th in threading.enumerate()}
    code = []
    for threadId, stack in sys._current_frames().items():
        code.append("\n# Thread: %s(%d)" % (id2name.get(threadId,""),
            threadId))
        for filename, lineno, name, line in traceback.extract_stack(stack):
            code.append('File: "%s", line %d, in %s' % (filename,
                lineno, name))
            if line:
                code.append("  %s" % (line.strip()))
    worker.log.debug("\n".join(code))

def worker_abort(worker):
    worker.log.info("worker received SIGABRT signal")

команда для запуска сервера "gunicorn -c gunicorn_conf.py django_server.wsgi: application "

вывод:

[2019-04-10 04:53:41 +0000] [12961] [INFO] Starting gunicorn 19.9.0
[2019-04-10 04:53:41 +0000] [12961] [INFO] Listening at: http://0.0.0.0:8000 (12961)
[2019-04-10 04:53:41 +0000] [12961] [INFO] Using worker: gthread
[2019-04-10 04:53:41 +0000] [12961] [INFO] Server is ready. Spawning workers
[2019-04-10 04:53:41 +0000] [12966] [INFO] Booting worker with pid: 12966
[2019-04-10 04:53:41 +0000] [12966] [INFO] Worker spawned (pid: 12966)
[2019-04-10 04:53:41 +0000] [12966] [INFO] 12966: App loaded
[2019-04-10 04:53:42 +0000] [12967] [INFO] Booting worker with pid: 12967
[2019-04-10 04:53:42 +0000] [12967] [INFO] Worker spawned (pid: 12967)
[2019-04-10 04:53:42 +0000] [12967] [INFO] 12967: App loaded

при поступлении первого запроса затем загрузить данные в память, и это происходит при каждом запросе:

[INFO][2019-04-10 04:54:13,458][config][12967][139679825889024]: Detected base directory /media/****/Linux storage/Project/django_server/image_search_module
[INFO][2019-04-10 04:54:18,375][config][12966][139679825889024]: Detected base directory /media/****/Linux storage/Project/django_server/image_search_module
[INFO][2019-04-10 04:54:20,537][config][12967][139679825889024]: path /media/****/Linux storage/Project/django_server/image_search_module/static/metadata/catalogue_metadata.csv.

Я хочу предварительно загрузить эти данные в память только один раз, а не в каждом запросе.

...