Skip to content

Commit 1af14bd

Browse files
committed
feat: add Gunicorn preload option and initialize shared resources
1 parent d9b7810 commit 1af14bd

File tree

4 files changed

+41
-10
lines changed

4 files changed

+41
-10
lines changed

apps/common/management/commands/services/services/gunicorn.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def cmd(self):
1818
bind = f'{HTTP_HOST}:{HTTP_PORT}'
1919
cmd = [
2020
'gunicorn', 'maxkb.wsgi:application',
21+
'--preload',
2122
'-b', bind,
2223
'-k', 'gthread',
2324
'--threads', '200',

apps/common/management/commands/services/services/local_model.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def cmd(self):
2828
worker = CONFIG.get("LOCAL_MODEL_HOST_WORKER", 1)
2929
cmd = [
3030
'gunicorn', 'maxkb.wsgi:application',
31+
'--preload',
3132
'-b', bind,
3233
'-k', 'gthread',
3334
'--threads', '200',

apps/common/management/commands/services/services/scheduler.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ def cmd(self):
2020
bind = f'127.0.0.1:6060'
2121
cmd = [
2222
'gunicorn', 'maxkb.wsgi:application',
23+
'--preload',
2324
'-b', bind,
2425
'-k', 'gthread',
2526
'--threads', '200',

apps/maxkb/wsgi.py

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,57 @@
1010
import os
1111

1212
from django.core.wsgi import get_wsgi_application
13+
#
14+
# # 检查是否启用 memray 分析
15+
# if os.environ.get('ENABLE_MEMRAY') == '1':
16+
# import memray
17+
# import atexit
18+
#
19+
# # 为每个进程创建单独的追踪文件
20+
# pid = os.getpid()
21+
# output_file = f"memray_output_{pid}.bin"
22+
#
23+
# tracker = memray.Tracker(output_file)
24+
# tracker.__enter__()
25+
#
26+
#
27+
# def cleanup():
28+
# tracker.__exit__(None, None, None)
29+
#
30+
#
31+
# atexit.register(cleanup)
1332

1433
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'maxkb.settings')
1534

1635
application = get_wsgi_application()
1736

1837

19-
20-
def post_handler():
38+
# -----------------------------
39+
# 全局初始化,只希望在 master preload 阶段执行一次
40+
# -----------------------------
41+
def preloaded_init():
2142
from common.database_model_manage.database_model_manage import DatabaseModelManage
2243
from common import event
44+
from common.utils.logger import maxkb_logger
2345

2446
event.run()
2547
DatabaseModelManage.init()
2648

49+
if os.environ.get("ENABLE_SCHEDULER") == "1":
50+
from common import job
51+
52+
job.run()
2753

28-
def post_scheduler_handler():
29-
from common import job
54+
maxkb_logger.info("✅ preloaded_init: master 初始化完成,内存将被 worker 共享")
3055

31-
job.run()
3256

33-
# 启动后处理函数
34-
post_handler()
57+
# Gunicorn preload 阶段会执行此逻辑
58+
if os.environ.get("GUNICORN_PRELOAD", "1") == "1":
59+
try:
60+
preloaded_init()
61+
except Exception as e:
62+
import traceback
63+
from common.utils.logger import maxkb_logger
3564

36-
# 仅在scheduler中启动定时任务,dev local_model celery 不需要
37-
if os.environ.get('ENABLE_SCHEDULER') == '1':
38-
post_scheduler_handler()
65+
maxkb_logger.info("⚠️ preload 初始化失败:", e)
66+
traceback.print_exc()

0 commit comments

Comments
 (0)