【问题标题】:Running the same task with different priorities using Celery使用 Celery 运行具有不同优先级的相同任务
【发布时间】:2012-05-26 10:05:36
【问题描述】:

所以我有一个非常有趣的场景,我想以不同的优先级运行同一个 Celery 任务,具体取决于它的调用位置 - 例如,我想为高级用户运行一个任务,其优先级高于非高级用户用户。

使用文档,我能够设置多个队列,并且能够通过将所有 .delay 调用更改为 .apply_async 调用并传入一个额外的 routing_key 来指定优先级队列,从而使其工作。问题是必须在很多不同的地方这样做。有没有更好的方法来处理这个?我试图尽可能避免更改视图中的代码,并且更愿意在任务或 celery 配置中处理此问题。

【问题讨论】:

  • 为什么不做不同的任务呢?
  • 然后我会重复相同的逻辑,所以我试图避免这种情况。我的另一个想法是向任务传递额外的参数以指示优先级并编写一个任务路由器来使用它来确定要传递哪个路由键。
  • 使它成为一个单独的函数,你有 def func(params) 并且在这两个任务中你可以调用相同的函数。单元测试也更容易。
  • 啊,我明白了。所以我基本上是在创建一个通用函数,然后让两个不同的函数调用它。看起来有点矫枉过正,但有道理。
  • 是的,我也不太喜欢。但是,在未来,它更容易管理和跟踪。这是一个务实的解决方案。

标签: django celery django-celery


【解决方案1】:

您可以使用部分评估而不是定义单独的任务。

from celery.task import task
from functools import partial

@task
def do_something():
    pass

premium_do_something = partial(do_something.apply_async, routing_key="premium")

do_something.async_apply()
premium_do_something()

【讨论】:

  • 啊,这很聪明。这将我定义的任务从 3 减少到 2。基本任务将使用默认路由键,而溢价将传递它自己的。有没有办法使用 .delay 与 .apply_async 来做到这一点 - 根据文档,它看起来好像只有 .apply_async 接受 routing_key 参数。
  • 延迟仅适用于简单的情况。它不接受 routing_key。
猜你喜欢
  • 1970-01-01
  • 2019-08-15
  • 2010-09-07
  • 2013-03-26
  • 2010-09-09
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
相关资源
最近更新 更多