Celery在其他任务完成后启动新任务
我在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_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
能知道要查找哪些食材或食谱,它也许可以检查这些结果,可能会有帮助?
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!