You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:06:24