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

使用subprocess启动Python大模型并行运行的FastAPI接口问题

问题分析与解决方案

问题根源

你遇到的覆盖问题不是subprocess的限制,而是两个核心共享资源冲突导致的:

  1. 固定日志/输出文件:每次请求都用output.txt和log.txt,且用"w"模式打开——这个模式会直接清空文件原有内容,不管之前的进程是否还在运行,同时多个进程写同一个文件也会导致内容混乱。
  2. 模型输出路径硬编码:如果model.py里的输出路径是固定的,多个并行运行的模型实例会互相覆盖对方的输出数据。

解决方案

1. 为每个进程生成独立的日志与输出文件

放弃固定文件名,给每个请求生成唯一标识(比如UUID、时间戳+PID),让每个进程拥有独立的日志和输出文件:

from fastapi import FastAPI
import subprocess
import uuid  # 新增导入

app = FastAPI()

@app.get('/index')
async def home():
  return "Hello World"

@app.post("/run")
async def create_run():
    run_id = str(uuid.uuid4())[:8]  # 生成短唯一ID,方便识别
    # 生成带唯一ID的日志文件路径
    out_file_path = f"output_{run_id}.txt"
    err_file_path = f"log_{run_id}.txt"
    
    # 用with语句管理文件,自动关闭避免资源泄漏
    with open(out_file_path, "w") as out_file, open(err_file_path, "w") as err_file:
        # 将run_id传给model.py,让模型也使用这个ID生成独立输出
        process = subprocess.Popen(
            ["python", "model.py", run_id],
            stdout=out_file,
            stderr=err_file
        )
    
    return f"run started with ID {run_id}. Check files prefixed with {run_id} for logs and output"

2. 修改model.py使用传入的唯一ID生成输出

在model.py中接收命令行传入的run_id,用它来命名输出文件,避免覆盖:

import sys

# 获取传入的run_id,默认值防止无参数启动报错
run_id = sys.argv[1] if len(sys.argv) > 1 else "default_run"
# 用run_id生成唯一的输出路径
model_output_path = f"数据获取位置/result_{run_id}.csv"  # 替换成你的模型输出格式

# 后续模型逻辑中,将结果写入model_output_path即可

3. 关于subprocess的并行能力

subprocess完全支持启动多个并行进程,只要每个进程的资源(文件、内存、CPU等)不互相抢占冲突,就能同时运行多个模型实例。你之前的问题只是共享文件的冲突,解决后就能实现预期的并行效果。

额外优化建议

  • 增加并发限制:如果模型占用大量资源,可通过信号量限制同时运行的进程数,避免服务器过载。
  • 记录进程信息:可以把每个run_id对应的PID存储起来,方便后续手动终止异常进程。
  • 考虑异步任务队列:如果需要更复杂的任务管理(比如重试、任务状态查询),可以用Celery之类的异步队列框架,但简单场景下上述修复足够。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:30:51