【问题标题】:Use celery as the model layer使用 celery 作为模型层
【发布时间】:2023-03-13 23:00:01
【问题描述】:

要求

我收到一个不寻常的要求:必须使用 celery 与数据库层进行通信。

应用程序在后端使用 Flask 和 MongoDB,在前端使用 Angular。

赞助商认为我可以启动一项任务,让其中一名工作人员将数据移入/移出 Mongo 并取回结果。

到目前为止我的研究

据我所知,如果我同步调用一个celery任务(使用__call__apply),任务是在本地执行而不是发送到数据库;如果我异步调用它,我必须在 Flask 端阻塞并继续轮询任务队列,直到我得到结果或返回错误。

另一种方法是将 REST API 修改为进行异步调用(立即返回任务 ID 并继续在客户端轮询结果。我个人讨厌这个想法,这对于毫秒范围内的任务(如基本 CRUD)来说看起来很愚蠢操作。

问题

是否有一种优雅的方式来包装 task.delay 以使其看起来像一个同步调用并且仍然让其中一个工作人员执行任务?

【问题讨论】:

  • 我真的很好奇他们为什么有这个要求?使用 Celery 的开销,生成 Celery 任务并等待结果比询问数据库要慢。
  • @olofom:货物崇拜设计?

标签: python angularjs mongodb flask celery


【解决方案1】:

是的,有 - 不知道我怎么错过了文档中的 AsyncResult.get

AsyncResult.get(timeout=None, propagate=True, interval=0.5)

等到任务准备好,然后返回结果。

所以你只需像这样调用任务:

task.delay(args).get(timeout=1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2016-01-31
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多