首页 文章

python芹菜 - 如何在运行时向工作者添加CELERYBEAT_SCHEDULE任务?

提问于
浏览
4

我创建了一个芹菜 Worker ,他们有一个celerybeat计划任务,以5秒的时间间隔运行 . 我想知道如何在不停止的情况下动态地向芹菜 Worker 添加另一个节拍任务 .

app.conf.update(
   CELERY_TASK_RESULT_EXPIRES=3600,
   CELERY_TIMEZONE = 'UTC',
   CELERYBEAT_SCHEDULE = {
    'long-run-5-secs': {
        'task': 'test_proj.tasks.test',
        'schedule': timedelta(seconds=5),
        'args': (16, )
    }
   }
)

通过上面的配置,我能够成功地以节拍模式运行芹菜工作者 .

现在我需要动态添加以下节拍时间表

'long-run-2-secs':{'task':'test_proj.tasks.test','schedule':timedelta(seconds = 2),'args':( 14,)},

需要帮助

谢谢

2 回答

  • 0

    我必须等待Celery ver.4.0 . 动态任务调度目前仅在 development 版本中受支持:http://docs.celeryproject.org/en/master/userguide/periodic-tasks.html#beat-entries

  • 1

    一种可能的方法是将任务存储在数据库中并动态添加删除任务 . 您可以使用数据库支持的芹菜节拍调度程序 . 请参阅https://django-celery-beat.readthedocs.io/en/latest/ . PeriodicTask数据库存储周期性任务 . 您可以使用数据库命令(Django ORM)来操作周期性任务 .

    这就是我处理动态任务(动态创建和停止任务)的方式 .

    from django_celery_beat.models import PeriodicTask, IntervalSchedule, CrontabSchedule
    
    chon_schedule = CrontabSchedule.objects.create(minute='40', hour='08', day_of_week='*', day_of_month='*', month_of_year='*') # To create a cron schedule. 
    schedule = IntervalSchedule.objects.create(every=10, period=IntervalSchedule.SECONDS) # To create a schedule to run everu 10 min.
    PeriodicTask.objects.create(crontab=chon_schedule, name='name_to_identify_task',task='name_of_task') # It creates a entry in the database describing that periodic task (With cron schedule).
    task = PeriodicTask.objects.create(interval=schedule, name='run for every 10 min', task='for_each_ten_min', ) # It creates a periodic task with interval schedule
    

    每当您更新PeriodicTask时,此表中的计数器也会递增,这会告诉芹菜节拍服务从数据库重新加载计划 .

    所以你不需要重启或杀死节拍 . 如果要在满足特定条件时停止任务

    periodic_task = PeriodicTask.objects.get(name='run for every 10 min')
    periodic_task.enabled = False
    periodic_task.save()
    

    当启用为False时,周期性任务变为空闲 . 您可以通过制作 enable = True 再次激活它 .

    如果您不再需要该任务,则只需删除该条目即可 .

相关问题