2016-12-12 65 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山下时,你会做什么?

在使用消息传递系统时,您确实希望构建递归树。做一些事情的工作主轴和产生更多的消息做更多的事情。除了这些循环(打算或其他)之外,最终将实现其基本情况并终止。

对于您实际尝试实现的任何答案都在于在您的消息系统和异步工作框架的限制范围内对问题进行重新编码。