我有一个非常耗时的任务(图像处理),它从给 FastAPI 端点的请求中接收一些输入数据。为了让呼叫者保持响应,我需要发送一个即时响应消息,如“ok”以及 201 状态代码(后者可选)。
到目前为止,我一直在使用这个:
from fastapi import BackgroundTasks, FastAPI
app = FastAPI()
def main_process(parameters)
...some long task
@app.post('/task')
async def do_task(reference_id: int,
bucket: str,
document_url: str,
return_url: str,
background_tasks: BackgroundTasks):
background_tasks.add_task(main_process, bucket, document_url, reference_id, return_url)
return 'ok'
每个main_process
任务从 S3 中的存储桶下载图像,然后进行一些处理。上面显示的解决方案可以正常工作,直到达到 10 个异步处理的图像(给定 async def)然后它崩溃。
我也尝试过增加一些 gunicorn 参数,比如max-requests
增加到 100,如下所示:
gunicorn api:app -b 0.0.0.0:8000 -w 4 -k uvicorn.workers.UvicornWorker --preload --max-requests 100 --daemon
这给了我更多处理空间(另外 20 张图像),但它还是崩溃了。
我也考虑过使用 Celery 或一些分布式任务队列解决方案,但我想让事情尽可能简单。
由于异步行为并不重要,但即时响应很重要,是否可以切换到同步解决方案但立即获得“ok”响应?