gpt4 book ai didi

python-3.x - 通过对 Python 3.6 Flask 应用程序中的路由的 HTTP 请求启动非阻塞异步函数调用

转载 作者:行者123 更新时间:2023-12-03 16:58:06 28 4
gpt4 key购买 nike

我目前正在编写一个基于 flask 的小型微服务,它使用 python 的 subprocess 模块通过调用 CLI 来启动其他 python 脚本。我的最终目标是对服务中的路由进行由 http 请求触发的非阻塞异步函数调用,并让服务从路由返回 200 响应,同时异步函数在后台运行。

我一直在仔细阅读文档(我为此服务使用 Python 3.6.3)无法弄清楚如何实现这一点。这是我的代码结构的一个小例子:

@app.route('/execute_job')
def execute_job():
params = ...
run_async_job(params)
return 'Launched async job according to params, it is now running.'

async def run_async_job(params):
command = 'run_python_cli_scripts args'
proc = subprocess.Popen(command)
# change some envs, do some file io, yada yada yada
...
while True:
if proc.poll() is not None: # the cli script is finished
return notify_external_api_job_complete()

我知道简单地调用 run_async_job(params) 并没有真正开始它的执行,而是返回一个 awaitableTask 这必须是在 event_loop 中抛出。我的问题是我不知道如何在 event_loop 中运行此任务,以便在完成之前到达 execute_job 中的 return。这种事情可能吗?这是我第一次涉足异步 python,我正在寻找类似于您在异步 javascript 中看到的行为。正在尝试将 async def 用于我想要非阻塞的函数错误的方法或者有没有办法在非阻塞的 event_loop 中启动任务时尚,以便上述 return 'Launched async job according to params, it is now running.' 可以达到并且函数在 run_async_job(params) 完成之前完成?

提前感谢您的时间和智慧。

最佳答案

Fwiw 后代:我选择使用通过 subprocess 模块启动的子进程。这可以通过将我从 async def 函数导入的库文件转换为一个脚本来实现,该脚本使用从 argparse 模块解析的命令行参数。我的路线现在看起来像

@app.route('/execute_job')
def execute_job():
params = ...
command = ('python', params)
subprocess.Popen(command)
return 'Launched async job according to params, it is now running.'

编辑:格式化

关于python-3.x - 通过对 Python 3.6 Flask 应用程序中的路由的 HTTP 请求启动非阻塞异步函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50536869/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com