如何向Celery Beat动态添加计划任务

Jak*_*cki 5 python celery python-3.x celerybeat

我正在使用Celery 3.1.23版,将动态计划的任务动态添加到芹菜节拍中。我有一名芹菜工作者和一名芹菜节拍实例正在运行。

运行task.delay()可以触发标准的芹菜任务。当我将计划的定期任务定义为配置中的设置时,芹菜节拍将其运行。

但是,我需要的是能够添加在运行时在指定的crontab上运行的任务。将任务添加到持久性调度程序后,芹菜节拍似乎无法检测到新添加的新任务。我可以看到celery-schedule文件确实有一个包含新任务的条目。

码:

scheduler = PersistentScheduler(app=current_app, schedule_filename='celerybeat-schedule')
scheduler.add(name="adder",
          task="app.tasks.add",
          schedule=crontab(minute='*/1'),
          args=(1,2))
scheduler.close()
Run Code Online (Sandbox Code Playgroud)

当我跑步时:

print(scheduler.schedule)
Run Code Online (Sandbox Code Playgroud)

我得到:

{'celery.backend_cleanup': <Entry: celery.backend_cleanup celery.backend_cleanup() <crontab: 0 4 * * * (m/h/d/dM/MY)>,
'adder': <Entry: adder app.tasks.add(1, 2) <crontab: */1 * * * * (m/h/d/dM/MY)>}
Run Code Online (Sandbox Code Playgroud)

请注意,app.tasks.add具有@celery.task装饰器。

Mau*_*cco 0

您可以通过启用自动重新加载来解决您的问题。

不过,我不能 100% 确定它适用于您的配置文件,但如果位于 CELERY_IMPORTS 路径中,则应该适用。

Hoverer 请注意,此功能是实验性的,不会在生产中使用。

如果您确实想要动态 celerybeat 调度,您始终可以使用另一个调度程序(例如 django-celery 调度程序)通过 django admin 管理数据库上的定期任务。

  • 在您的用例中,很明显基于配置的调度不是正确的方法,只需编写您自己的调度程序并使用数据库作为后端或使用许多调度程序之一,例如 https://github.com/kongluoxing/celerybeatredis。 (4认同)