Для настройки производства: 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.
Я хочу предварительно загрузить эти данные в память только один раз, а не в каждом запросе.