2014-08-29 74 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