芹菜节拍时间表:芹菜开始时立即运行任务?

时间:2015-03-10 10:39:40

标签: python celery celerybeat

如果我使用timedelta(days=1)制作芹菜节拍时间表,第一项任务将在24小时后进行,引用芹菜节拍文件:

  

使用timedelta进行计划意味着任务将以30秒的间隔发送(第一项任务将在芹菜节拍开始后30秒发送,然后在最后一次运行后每30秒发送一次)

但事实是,在很多情况下,调度程序在启动时运行任务实际上很重要但是我没有找到一个允许我在芹菜后立即运行任务的选项开始,我不仔细阅读,还是芹菜错过了这个功能?

3 个答案:

答案 0 :(得分:2)

我决定我可以声明每个任务的实例,并在celery启动时执行它们。我根本不喜欢这个,因为它使芹菜的开始速度非常慢(如果你的速度慢PeriodicTask),但它可以做我想要的。

只需将其添加到tasks.py

的末尾即可
########### spawn all tasks at launch! ############
localmess = locals().values()
for obj in localmess:
    if isclass(obj):
        if obj is not PeriodicTask and issubclass(obj, PeriodicTask):
            instance = obj()
            logger.info('running {0}'.format(obj))
            try:
                instance.run()
            except:
                logger.warn('task fail: {0}'.format(obj))
                pass

######## all tasks must be decleared above! ########

答案 1 :(得分:0)

最好的想法是创建一个在完成任务后自行安排任务的实现。此外,创建一个入口锁,以便每个时刻不能执行多次任务。 触发执行一次。

在这种情况下,

  • 你不需要celerybeat过程
  • 保证任务执行

答案 2 :(得分:0)

您可以在工作人员准备好使用 worker_ready.connect 装饰器时立即运行任务:

from celery.signals import worker_ready

@worker_ready.connect
def at_start(sender, **kwargs):
    """Run tasks at startup"""
    with sender.app.connection() as conn:
        sender.app.send_task("app.module.task", connection=conn)

归功于此答案:https://stackoverflow.com/a/14589445/3922534