【问题标题】:Celery Starting a Task when Other Tasks have CompletedCelery 在其他任务完成后启动任务
【发布时间】:2014-08-29 22:06:57
【问题描述】:

我在 Celery 中有 3 个任务..

celery_app.send_task('tasks.read_cake_recipes')
celery_app.send_task('tasks.buy_ingredients')

celery_app.send_task('tasks.make_cake')

read_cake_recipes 和 buy_ingredients 都没有任何依赖关系,但是在任务 make_cake 可以运行之前,read_cake_recipes 和 buy_ingredients 都需要完成。

make_cake 可以在前两个启动后的任何时间运行。但是make_cake 不知道其他任务是否已经完成。所以如果read_cake_recipes 或buy_ingredients 花费的时间太长,那么make_cake 就会惨遭失败。

链接任务似乎在这里不起作用,因为make_cake 有多个依赖项。

我怎样才能仍然开始任务make_cake,但让它等待/挂起等,直到其他两个任务首先完成?

我的优点是 read_cake_recipes 和 buy_ingredients 将结果保存到数据库中,如果 make_cake 知道要查找哪些成分或食谱,也许可以检查一下?

【问题讨论】:

  • read_cake_recipes 和 buy_ingredients 是独立任务有什么原因吗?即,它们有时会在没有make_cake 的情况下运行吗?
  • @CaseyKinsey 是的,这些任务有时在没有 make_cake 的情况下运行。 make_cake 可能永远不会运行。但是如果它确实被调用了,那么它需要将其他两个任务结果放在一起,然后做一个蛋糕。

标签: python django celery


【解决方案1】:

完全猜测您的底层架构,但这里是..

class Cake(models.Model):
    recipes_read = models.BooleanField(default=False)
    ingredients_purchased = models.BooleanField(default=False)
    batter_prepared = models.BooleanField(default=False)

    def save(self, *args, **kwargs):
        if self.recipes_read and self.ingredients_purchased:
            self.batter_prepared = True
        super(Cake, self).save(*args, **kwargs)


@task
read_cake_recipes():
    for cake in Cake.objects.all():
        # Read some shit!
        cake.recipes_read = True
        cake.save()

@task
buy_cake_ingredients():
    for cake in Cake.objects.all():
        # Buy some shit!
        cake.ingredients_purchased = True
        cake.save()

@task
make_cake():
    for cake in Cake.objects.filter(batter_prepared=True):
        # Make that shit!

【讨论】:

  • 这看起来不错。但是,make_cake 开始,如果没有准备好失败(因为它应该),那么我需要 Celery 继续检查,即在这种情况下,如果batter_prepared = true。
  • 再说一次,这只是对您的设计的猜测,但我设想 make_cake 任务会定期运行。
  • 你的回答真的很有帮助。谢谢。我使用了你的检查方法并在 retry() 中添加了 celery 构建,这样它会一直尝试直到它得到它需要的东西。
猜你喜欢
  • 2021-10-15
  • 2016-01-03
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2019-02-22
  • 2016-10-02
相关资源
最近更新 更多