Celery在其他任务完成后启动新任务

4 投票
1 回答
647 浏览
提问于 2025-04-18 21:47

我在Celery中有三个任务。

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

celery_app.send_task('tasks.make_cake')

其中,read_cake_recipesbuy_ingredients这两个任务之间没有依赖关系,但在运行make_cake这个任务之前,read_cake_recipesbuy_ingredients必须先完成。

只要前两个任务开始后,make_cake就可以在任何时候运行。但是,make_cake并不知道其他任务是否已经完成。所以,如果read_cake_recipesbuy_ingredients花费的时间太长,make_cake就会失败。

在这里,任务链似乎不太管用,因为make_cake有多个依赖关系。

我该如何启动make_cake这个任务,但让它在其他两个任务完成之前保持等待状态呢?

我的一个好消息是,read_cake_recipesbuy_ingredients会把结果保存到数据库,如果make_cake能知道要查找哪些食材或食谱,它也许可以检查这些结果,可能会有帮助?

1 个回答

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!

撰写回答