Python - 长时间运行进程的状态多个进程的可能性

问题描述

我使用 Python 和 FastAPI 构建了一个 API。使用此 API,我的目标是可以训练自定义的 spaCy NLP 模型。

这是我的代码

'''
main.py
'''
from fastapi import FastAPI,HTTPException
from pydantic import BaseModel
import subprocess
import sys

app = FastAPI()

class Project(BaseModel):
    token: str

def run_task(cmd,project_path):
    process = subprocess.Popen(cmd,cwd=project_path,shell=True,bufsize=1,universal_newlines=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    return process


@app.post("/project/train")
async def main(project: Project):
    project_path = '/'.join(["textcat","projects",project.token]) 
    process = run_task("python -u -m spacy project run all",project_path)
    

    return {
        "status": "success","process_id" : process.pid
    }  

我通过以下方式运行应用程序:

python -m uvicorn main:app

然后,我触发一个 POST 请求到:http://127.0.0.1:8000/project/train 与以下正文:

{
   "token":"1234"
}

我触发的子进程 python -m spacy project run all 基本上是运行 spaCy workflow,这可能需要相当长的时间(小时)才能完成。

假设,在我的团队中,我们有两个用户,每个用户都想训练一个自定义模型——这意味着我们都将向 API(使用不同的项目令牌)发送请求,并触发 NLP 模型的训练。

有没有办法查询正在运行的进程以获取每个进程的输出/进度?

解决方法

我看到了两种方法:

  • 在文本文件中记录您的进度
  • 在数据库中记录您的进度

在任何情况下,您都必须将其写在磁盘上的某个位置,而不是内存中,以便在应用程序意外停止的情况下,您仍然可以知道您的工作在哪里停止。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...