Django runserver为何启动两个进程?作用及代码区分方法
Django runserver 双进程的作用与区分方法
两个进程的作用
- 监控进程(父进程):全程运行至服务器停止,核心工作是监听项目文件的改动(代码、配置文件等)。一旦检测到文件变更,会重启负责处理请求的子进程,实现开发时的代码热重载,让修改立即生效。
- 请求处理进程(子进程):实际处理HTTP请求的进程,所有视图逻辑、路由解析、业务处理都在这个进程中完成。当文件发生变更时,监控进程会终止旧的子进程,重新启动新的子进程加载更新后的代码。
代码中区分两个进程的方法
1. 检查环境变量
Django在启动请求处理进程时,会自动设置特定环境变量,可直接通过该变量判断:
import os if os.environ.get('RUN_MAIN') == 'true': print(f"请求处理进程ID: {os.getpid()}") else: print(f"监控进程ID: {os.getpid()}")
RUN_MAIN值为'true'时是处理请求的子进程;监控进程的该变量不存在或不为'true'。
2. 通过进程父ID(PPID)判断
监控进程是请求处理进程的父进程,可通过父进程的信息区分:
import os import psutil current_pid = os.getpid() parent_pid = os.getppid() parent_process = psutil.Process(parent_pid) if parent_process.name() == 'python' and 'manage.py' in parent_process.cmdline(): print(f"请求处理进程ID: {current_pid}") else: print(f"监控进程ID: {current_pid}")
此方法需先安装psutil库(pip install psutil),通过父进程的命令行参数确认进程关系。
3. 结合启动参数判断
如果启动runserver时未加--noreload参数,会启动双进程,可结合参数与环境变量判断:
import sys import os if 'runserver' in sys.argv and '--noreload' not in sys.argv: if os.environ.get('RUN_MAIN') == 'true': print("当前为请求处理进程") else: print("当前为监控进程")
若添加--noreload参数,runserver仅启动单个进程,无热重载功能。
内容的提问来源于stack exchange,提问作者Menas
相关产品推荐
相关产品推荐

