python 有没有办法在没有BackgroundTasks的情况下通过FastAPI异步处理SQS消息?

siv3szwd  于 2022-12-10  发布在  Python
关注(0)|答案(1)|浏览(207)

我一直在寻找使用FastAPI实现后台作业的方法。我有一个API /api/event,它验证传入的请求,并将待处理的事件添加到SQS队列,如果事件被接受,则将HTTP 202(接受)返回给用户,否则返回HTTP 200(OK)。
根据我在FastAPI文档中读到的内容,调用BackgroundTask的方法是通过另一个API。
现在我想做的是,保持一个后台任务运行(如cronjob),该任务轮询SQS队列中的消息,处理这些事件并删除它们。(这部分不应该依赖于API调用)我希望最好在FastAPI项目中完成此操作。
阅读FastAPI文档并没有为我提供足够的信息来实现这一点。我还尝试使用__init__.py文件调用一个基本的后台作业(打印日期时间),但它控制了FastAPI进程,API变得不可用。

vlju58qv

vlju58qv1#

有两种方法可以实现这一点
1.使用celery进行事件的异步处理(它确实支持它)
1.将asyncawait与事件处理函数一起使用
正如您提到的,如果您希望在本机FAST API中使用某些功能,那么我认为最好使用async,并等待如下所示

async def get_event_done(event: list):
    # Do some asynchronous stuff to process the event
    return "event processed"

现在,让我们将上述函数与python内置库asyncio结合使用

futures = [get_event_done(event1), get_event_done(event2)]
event1_result,event_2_result = await asyncio.gather(*futures)

print("event 1 result", event1_result)
print("event 2 result", event2_result)

使用asyncio.gather收集结果非常简单和聪明

更多参考资料:

相关问题