我试图弄清楚如何在 celery 中配置一个定期任务,以安排在负载上运行,而不管时间间隔如何。
例如,
beat_schedule = {
'my-task': {
'task': 'module.my_task',
'schedule': 60.0,
},
}
节拍第一次开始运行后将等待 60 秒。
对于较长的时间间隔(例如一个小时)来说,这是有问题的,因为它可以完成立即有价值的工作,但在较短的时间间隔内不需要“新鲜”。
This question https://stackoverflow.com/questions/28961517/celery-beat-schedule-run-task-instantly-when-start-celery-beat解决了这个问题,但两个答案都不令人满意:
为要排队的任务添加启动延迟不仅在性能方面不理想,而且不利于可维护性,因为初始运行和计划现在是分开的。
在任务中重新实现计划不利于可维护性。
在我看来,这应该是显而易见的事情,所以我很惊讶,这个问题就是我在此事上所能找到的全部。我无法从文档和 celery github 问题中弄清楚这一点,所以我想知道我是否遗漏了一些明显的东西。
Edit:
这里的故事似乎还有更多内容,因为在尝试了一个小时间隔的不同任务后,它在 celery 项目启动时立即运行。
如果我停下来并清理队列celery purge -A proj -f
然后再次启动celery,任务在心跳间隔内没有运行。这是有道理的,因为工作人员处理消息,但节拍有自己的计划记录celerybeat-schedule
这将不受清洗的影响。
如果我删除celerybeat-schedule
并重新启动击败任务仍然没有运行。使用非默认计划数据库位置启动 celerybeat 也不会导致任务运行。任务下次运行的时间是从我开始新节拍的时间起一小时 (14:59)not距离任务第一次开始时间(13:47)一小时。
似乎有一些状态没有很好地记录或未知,这是此问题的基础。我的问题也可以表述为:如何强制beat清除其最近运行的记录?.
我还担心在运行工人和殴打时,运行celery -A proj inspect scheduled
gives - empty -
但想必该任务必须在某个时刻进行安排,因为它会运行。