【问题标题】:FastAPI - Best way to run continuous GET requests in the backgroundFastAPI - 在后台运行连续 GET 请求的最佳方式
【发布时间】:2021-04-20 04:10:39
【问题描述】:

我正在尝试创建一个程序,该程序执行来自大约 10 个网站的定期 GET 请求并在本地更新数据库中的信息。现在当用户想要信息时,我会显示本地存储的聚合信息。

我正在尝试找出在 FastAPI 中运行这些定期 GET 请求的最佳方式。我是 FastAPI 的新手,仍在尝试解决问题。

经过一番研究,我可以想到两个选择:

  1. 使用定期运行的后台任务端点,并从每个网站逐一执行 GET 请求。
  2. 使用 Celery 执行这些 GET 请求

如果有人做过类似的事情,我正在尝试找出最好的方法,或者我将如何找到最好的方法?

【问题讨论】:

  • 只是检查。 FastAPI 用于构建网站。如果这是一个独立于传入请求的后台任务,则不需要 FastAPI。它可以只是一个周期性的cron 作业,它使用requests 模块执行一系列请求。对吗?
  • 是的,这也有道理,谢谢。由于我将 FastAPI 用于网站本身,因此我认为将 fastAPI 用于此特定目的是有意义的,因为它已经在应用程序中具有数据库连接性和类似的东西。但我也会考虑使用它。谢谢

标签: python celery fastapi


【解决方案1】:

我认为对于一项定期任务来说,Celery 太过分了。 Celery 需要一个代理(以及最好的后端)。你打算只为单个任务启动/管理 RabbitMQ 吗?

一个更简单的解决方案可以使用asyncio

TIME_INTERVAL_IN_SEC = 60


async def crawl_websites():
    while True:
        # async GET requests
        # async update DB
        await asyncio.sleep(TIME_INTERVAL_IN_SEC)


loop = asyncio.get_event_loop()
task = loop.create_task(crawl_websites())
loop.run_until_complete(task)

【讨论】:

  • 感谢您的回复。我会尝试这种方法。按照我的理解,如果我在 fastAPI 中运行这个块,它将在与后端功能的其余部分相同的事件循环中运行。所以你会建议我从 fastAPI 之外的脚本运行它,或者如果我从 fastAPI 中运行它不会有任何区别?
  • 你可以在快速 API 中运行,这里也有一个讨论:github.com/tiangolo/fastapi/issues/543
猜你喜欢
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 2021-07-12
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 2015-01-24
相关资源
最近更新 更多