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

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
    

排查步骤

  1. 基础验证:先在两个应用上分别运行python manage.py runserver --noreload --nothreading,观察是否还存在多进程/线程。如果都消失,说明原问题是默认的自动重载和多线程机制导致的。
  2. 对比配置差异:仔细对比两个应用的settings.py,重点检查:
    • DEBUG值是否一致
    • INSTALLED_APPS、MIDDLEWARE中的第三方依赖是否有差异
    • 有没有自定义的WSGI相关配置
  3. 查看进程/线程详情:
    • 用ps -ef | grep python查看进程的命令行参数,区分主进程(带--noreload的是单进程,否则有主/子进程)
    • 在htop中按H键切换到线程视图,查看线程名称,判断是Django原生线程还是第三方库创建的
  4. 逐步排查依赖:把可疑的第三方app从INSTALLED_APPS中注释掉,重启runserver,逐个验证是否是某个依赖导致的额外进程/线程。
  5. 检查自定义代码:搜索应用代码中是否有threading.Thread、multiprocessing.Process或asyncio相关的代码,尤其是AppConfig.ready()方法、启动脚本、全局初始化逻辑,这些地方可能会主动创建线程/进程。

内容的提问来源于stack exchange,提问作者Krishna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 23:53:17