2016-12-12 89 views
5

我想在另一組任務結束時動態地安排與芹菜的定期任務。芹菜 - 在另一任務結束時安排定期任務

我知道如何創建(靜態)與芹菜週期性任務:

CELERYBEAT_SCHEDULE = { 
     'poll_actions': { 
      'task': 'tasks.poll_actions', 
      'schedule': timedelta(seconds=5) 
     } 
} 

但我想從我的任務動態創建定期作業(也許有辦法阻止那些週期性的作業時,一些條件實現(所有任務完成)

喜歡的東西:

@celery.task 
def run(ids): 
    group(prepare.s(id) for id in ids) | execute.s(ids) | poll.s(ids, schedule=timedelta(seconds=5)) 

@celery.task 
def prepare(id): 
    ... 

@celery.task 
def execute(id): 
    ... 

@celery.task 
def poll(ids): 
    # This task has to be schedulable on demand 
    ... 

回答

3

直截了當的解決方案,這需要您可以添加/刪除節拍調度ENTR在飛行中。作爲這個問題的應答的...

How to dynamically add/remove periodic tasks to Celery (celerybeat)

這是不可能的。我懷疑它在此期間已經上市,因爲...

您在這裏混淆了兩個概念。 「事件驅動的工作」的概念和「批次計劃驅動的工作」的想法(這實際上只是第一種情況,事件發生在時間表)。如果你真的考慮你在做什麼,你會發現有一組相當複雜的邊緣案例。消息本質上是分佈式的,當從不同消息產生的組開始創建衝突條目時會發生什麼?當你發現自己在一個以前預定的kruft山下時,你會做什麼?

在使用消息傳遞系統時,您確實希望構建遞歸樹。做一些事情的工作主軸和產生更多的消息做更多的事情。除了這些循環(打算或其他)之外,最終將實現其基本情況並終止。

對於您實際嘗試實現的任何答案都在於在您的消息系統和異步工作框架的限制範圍內對問題進行重新編碼。