首页 > 解决方案 > 运行外部程序不挂服务器fast-api

问题描述

我试图在 python 中运行一个 Fast-Api 服务器来处理一个大约需要 30-40 秒才能完成的过程。第二个脚本使用 Selenium 模块来收集经过处理的图像,所以我认为它不能通过正常的异步操作来处理。我希望将第二个脚本函数作为一种后台工作程序,它不会阻止其他请求的运行。

目前,我让服务器执行程序并返回其输出,但问题是它使服务器停止并一个接一个地运行。理想情况下,此过程将一次运行多个并将它们返回为已完成。

我的代码示例:FastApi 应用程序:


from fastapi import FastAPI
import sys
import subprocess
app = FastAPI()

def run_program():
    s2_out = s2_out = subprocess.check_output([sys.executable, "script2.py"])
    return s2_out

@app.get("/")
async def read_root():
    return run_program()

script2.py 代码(服务器从什么获取输出):

import sys,time,random
counter = 0

def main():
    global counter
    timeValue = random.randint(0,10)
    time.sleep(timeValue)
    print(f'Run Number:{counter} | Finished after:{timeValue} Seconds')
    counter += 1

if __name__ == "__main__":
    main()

ServerTest.py 代码(我用什么来测试服务器。)

from concurrent.futures import ThreadPoolExecutor
import requests
Counter = 0
def main():
    global Counter
    PreviousNum = Counter
    print(f'Sending Request Number:{PreviousNum}')
    r = requests.get('http://127.0.0.1:8000')
    print(f'Request Number:{PreviousNum} Finished With Response:{r.content.decode()}')
with ThreadPoolExecutor() as executor:
    for x in range(10):
        executor.submit(main)
        Counter += 1

ServerTest.py 返回

Sending Request Number:0
Sending Request Number:1
Sending Request Number:2
Sending Request Number:3
Sending Request Number:4
Sending Request Number:5
Sending Request Number:6
Sending Request Number:7
Sending Request Number:8
Sending Request Number:9
Request Number:3 Finished With Response:"Run Number:0 | Finished after:10 Seconds\r\n"
Request Number:6 Finished With Response:"Run Number:0 | Finished after:10 Seconds\r\n"
Request Number:2 Finished With Response:"Run Number:0 | Finished after:0 Seconds\r\n"
Request Number:5 Finished With Response:"Run Number:0 | Finished after:10 Seconds\r\n"
Request Number:9 Finished With Response:"Run Number:0 | Finished after:6 Seconds\r\n"
Request Number:4 Finished With Response:"Run Number:0 | Finished after:5 Seconds\r\n"
Request Number:7 Finished With Response:"Run Number:0 | Finished after:8 Seconds\r\n"
Request Number:8 Finished With Response:"Run Number:0 | Finished after:1 Seconds\r\n"
Request Number:0 Finished With Response:"Run Number:0 | Finished after:2 Seconds\r\n"
Request Number:1 Finished With Response:"Run Number:0 | Finished after:5 Seconds\r\n"

我知道运行编号已关闭。我应该将其作为参数传递,而不是放在脚本中。但是所有的项目都是一个接一个。这导致它需要 67 秒。

我正在寻找此服务器运行的理想方式和方式是总时间大约需要 10-11 秒。因为 10 秒是最高的睡眠值。

有没有一种方法可以让服务器在新线程中通过子进程运行 script2.py 并在它们完成时返回每个值,而不是一一等待?

我不认为 subprocess 支持通过异步使用返回值。

任何帮助表示赞赏。谢谢

编辑:在使用子进程之外,我还尝试通过将脚本导入服务器脚本并通过线程池执行器运行它来运行脚本。但是从那里返回结果仍然会导致它 1 比 1。

标签: pythonasynchronousserverfastapi

解决方案


推荐阅读