【问题标题】:Separate FastAPI Server from Celery Workers Server - Directory Structure将 FastAPI 服务器与 Celery Workers 服务器分开 - 目录结构
【发布时间】:2021-10-30 01:51:41
【问题描述】:

我正在使用 Celery 在单个服务器上运行 FastAPI 应用程序来完成繁重的工作。对 FastAPI 服务器的每个请求都会在同一台服务器上启动一个可以运行数小时的任务。

因此,目前 API 代码和 celery workers 代码驻留在同一台服务器上并在同一台服务器上运行。 我将 API 服务器启动为:

uvicorn app:app.main --port <PORT> --host <HOST>

和工人一样:

celery -A app.worker worker --loglevel=info

当前目录结构大致如下,任务定义在tasks/tasks.py,由worker.py发现。 API 路由从tasks/tasks.py 导入特定的任务函数,并在它们上调用test_task.delay()

app/
    models/
        __init__.py
        model1.py
        model2.py
    routers/
        __init__.py
        router1.py
        router2.py
    tasks/
        __init__.py
        tasks.py
    main.py
    worker.py

但我预计未来几天会出现高负载。我期待着通过一台仅处理 API 请求的服务器和多台运行 celery worker 的高端服务器进行扩展,连接到同一个代理实例。

我希望 API 代码保持为一个单独的模块,worker 保持为一个单独的模块,以便它们可以单独部署,但可以从 FastAPI 应用程序调用任务。

但是,我无法理解如何以一种不需要在 celery 服务器上加载 FastAPI 代码(反之亦然)的方式准确地构建我的项目文件,同时保持系统健壮、可扩展和生产就绪。

我是新手,如果这是一个菜鸟问题,请原谅。

【问题讨论】:

    标签: python celery fastapi


    【解决方案1】:

    我不是特别明白为什么celery任务需要从api类中导入,但是如果你想从api中去除对celery任务的依赖,你应该使用Celery.send_task函数,这样你就可以调用任务名称而不是需要导入它们。

    from celery import Celery
    app = Celery(broker='some broker url', backend='some backend url')
    app.send_task('task_name', kwargs={
        'param1': 'value1',
        'param2': 'value2',
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多