Django 4.1.6 runserver启动时产生多进程/线程的原因及排查
Django runserver 多进程/线程问题分析与解决
可能的原因
- 自动重载机制:默认情况下,
runserver会启动两个进程——一个主进程负责监控文件变化并触发重载,另一个子进程处理实际请求。如果另一个应用没出现这种情况,可能是它运行时加了--noreload参数,或是没有文件变动触发重载逻辑。 - 默认多线程处理:Django 4.1.6的开发服务器在
DEBUG=True时,默认启用多线程处理并发请求。当有多个请求同时进来时,就会生成多个线程。另一个应用没看到线程,可能是没有并发请求,或是被强制设置为单线程。 - 第三方依赖/自定义代码:某些第三方库(如缓存连接池、异步任务工具)或自定义中间件、
AppConfig.ready()方法里的代码,可能会在启动时额外创建线程或进程。比如使用django-redis的连接池、Celery自动初始化,或是手动在代码中创建了线程/进程。
控制进程/线程的设置
- 禁用自动重载:运行命令时添加
--noreload参数,关闭文件监控重载机制,只会保留一个处理请求的进程:python manage.py runserver --noreload - 强制单线程模式:使用
--nothreading参数禁用多线程,强制服务器用单线程处理请求:python manage.py runserver --nothreading - 指定线程数:如果需要自定义线程数量,可以用
--threads参数设置,比如限制为2个线程:python manage.py runserver --threads 2
排查步骤
- 基础验证:先在两个应用上分别运行
python manage.py runserver --noreload --nothreading,观察是否还存在多进程/线程。如果都消失,说明原问题是默认的自动重载和多线程机制导致的。 - 对比配置差异:仔细对比两个应用的
settings.py,重点检查:DEBUG值是否一致INSTALLED_APPS、MIDDLEWARE中的第三方依赖是否有差异- 有没有自定义的WSGI相关配置
- 查看进程/线程详情:
- 用
ps -ef | grep python查看进程的命令行参数,区分主进程(带--noreload的是单进程,否则有主/子进程) - 在htop中按
H键切换到线程视图,查看线程名称,判断是Django原生线程还是第三方库创建的
- 用
- 逐步排查依赖:把可疑的第三方app从
INSTALLED_APPS中注释掉,重启runserver,逐个验证是否是某个依赖导致的额外进程/线程。 - 检查自定义代码:搜索应用代码中是否有
threading.Thread、multiprocessing.Process或asyncio相关的代码,尤其是AppConfig.ready()方法、启动脚本、全局初始化逻辑,这些地方可能会主动创建线程/进程。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

