如何实现Django启动后并发运行多个Python文件直至项目终止
在Django中启动项目时并发运行多个Python文件的方案
当然有办法实现这个需求!下面给你几个实用的方案,你可以根据自己的场景(比如脚本是IO密集型还是CPU密集型,是否需要访问Django内部组件等)来选择:
方案1:自定义Django管理命令+多线程(适合IO密集型脚本)
你可以编写一个继承自默认runserver的自定义命令,在启动服务器的同时,用后台线程运行你的其他脚本。
步骤:
- 在你的Django应用下创建
management/commands目录(如果没有的话),并添加__init__.py文件让Python识别为包。 - 创建
runserver_with_workers.py文件,内容如下:
import os import sys import threading from django.core.management.commands.runserver import Command as RunserverCommand def run_script(script_path): """运行指定的Python脚本""" os.system(f"{sys.executable} {script_path}") class Command(RunserverCommand): help = "启动Django服务器的同时运行额外的并发脚本" def handle(self, *args, **options): # 替换成你实际要运行的脚本路径 target_scripts = [ "/absolute/path/to/your/script1.py", "/absolute/path/to/your/script2.py" ] # 为每个脚本启动守护线程(主线程结束时自动终止) for script in target_scripts: script_thread = threading.Thread(target=run_script, args=(script,), daemon=True) script_thread.start() # 继续启动Django开发服务器 super().handle(*args, **options)
- 运行命令:
python manage.py runserver_with_workers,此时你的脚本会和Django服务器同时启动,终止服务器时脚本也会跟着停止。
方案2:自定义命令+多进程(适合CPU密集型脚本)
如果你的脚本是CPU密集型的,多线程因为GIL的限制效率不高,改用多进程会更合适。只需修改上面的代码,把threading.Thread换成multiprocessing.Process:
import os import sys import multiprocessing from django.core.management.commands.runserver import Command as RunserverCommand def run_script(script_path): os.system(f"{sys.executable} {script_path}") class Command(RunserverCommand): help = "启动Django服务器的同时运行额外的并发脚本(多进程版)" def handle(self, *args, **options): target_scripts = [ "/absolute/path/to/your/script1.py", "/absolute/path/to/your/script2.py" ] for script in target_scripts: script_process = multiprocessing.Process(target=run_script, args=(script,), daemon=True) script_process.start() super().handle(*args, **options)
方案3:用Honcho管理多进程(无需修改Django代码)
如果你不想改动项目代码,可以用honcho这个工具,它能同时启动多个进程并统一管理。
步骤:
- 安装Honcho:
pip install honcho - 在项目根目录创建
Procfile文件,内容示例:
web: python manage.py runserver worker1: python /absolute/path/to/script1.py worker2: python /absolute/path/to/script2.py
- 运行命令:
honcho start,所有定义的进程会同时启动;按下Ctrl+C终止时,所有进程都会被停止。
注意事项
- 如果你的脚本需要访问Django的ORM、配置等内部组件,要在脚本开头添加Django环境初始化代码:
import os import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings") django.setup()
- 确保脚本路径使用绝对路径,避免因工作目录变化导致找不到文件。
内容的提问来源于stack exchange,提问作者yegemen
相关产品推荐
相关产品推荐

