python - 运行外部程序不挂服务器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。
解决方案
推荐阅读
- python - 我的代码抛出递归错误。有人可以向我解释我的递归基本代码有什么问题吗?
- ubuntu - “权限被拒绝:'/dev/ttyUSB0'”尽管已经是“拨出”的成员
- elixir - 来自 Dbgi 块的漂亮打印 Elixir 源代码
- delphi - 验证通过 ISAPI-dll 发送 SMTP 电子邮件的问题
- c# - 在其 Visual Studio 工具提示中添加函数的使用信息
- java - 使用 RestHighLevelClient (JAVA Spring-boot) 搜索空格分隔的字符串时没有结果
- ruby-on-rails - 如何在表单中使用 collection _select 从另一个表中选择两个值?
- python - Seaborn facetgrid 气泡图
- command-line-interface - 在 api 网关中,我如何使用 CLI 发布文档部分
- swift - AudioKit - 通过应用程序路由多通道信号(macOS,swift)