如何解决运行外部程序而无需挂起服务器fast-api
我试图在python中运行Fast-Api服务器,该服务器处理大约30-40秒才能完成的过程。第二个脚本使用Selenium模块收集经过处理的图像,因此我认为无法使用常规的异步操作来处理它。我希望将第二个脚本功能用作一种后台工作程序,以防止其他请求被运行。
此刻,我让服务器执行程序并返回其输出,但问题是它使服务器停顿并逐1变1。理想情况下,此过程将一次运行多个并完成后返回它们。
我的代码示例: 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"
我知道运行编号已关闭。我应该将其作为参数传递,而不是放在脚本中。但是所有项目都是1乘1的。这花费了67秒。
我希望该服务器运行的理想方式是花费大约10-11秒的总时间。因为10秒是最高的睡眠值。
有没有一种方法可以让服务器在新线程中通过子进程运行script2.py并在完成时返回每个值,而不是一一等待?
我不认为子进程支持通过异步使用返回值。
任何帮助,我们将不胜感激。谢谢
编辑:除了使用子进程外,我还尝试通过将脚本导入服务器脚本并通过线程池执行程序运行脚本来运行脚本。但是从中返回结果仍然会使结果乘以1。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。