2014-08-29 50 views
3

我有芹菜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_recipesbuy_ingredients没有任何依赖关系,任务make_cake可以运行之前,但双方read_cake_recipesbuy_ingredients需要完成。

make_cake可以在前两次启动后的任何时候运行。但make_cake不知道其他任务是否已完成。因此,如果read_cake_recipesbuy_ingredients花费太长时间,则make_cake失败。

链接任务在这里似乎不起作用,因为make_cake有一个以上的依赖关系。

我该如何启动任务make_cake,然后让它等待/等待等,直到其他两个任务先完成?

我的保存优雅是,read_cake_recipes和buy_ingredients将结果保存到数据库,如果make_cake以某种方式知道哪些成分或食谱可以检查它,也许?

+0

有任何理由'read_cake_recipes'和'buy_ingredients'是独立的任务是什么?即它们是否有时在没有'make_cake'的情况下运行? – 2014-08-29 22:14:47

+0

@CaseyKinsey是的,这些任务有时在没有make_cake的情况下运行。 make_cake可能永远不会运行。但是如果它确实被调用,那么它需要将其他任务结果放在一起,并且做一个蛋糕。 – Prometheus 2014-08-29 22:18:11

回答

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! 
+0

这看起来不错。然而,make_cake开始,如果没有准备好失败(因为它应该),那么我需要Celery继续检查我在这种情况下,如果batter_prepared = true。 – Prometheus 2014-08-30 07:24:45

+1

再一次,这只是对您设计的猜测,但我设想make_cake任务定期运行。 – 2014-08-30 13:07:44

+0

你的回答真的很有帮助。谢谢。我用你的检查方法,并在retry()中添加celery构建,这样它就会一直尝试,直到它有它所需要的。 – Prometheus 2014-08-30 17:31:35