芹菜节拍计划,计划在负载下运行,然后间隔运行

Jmi*_*lls 6 python celery

我试图弄清楚如何在celery中配置一个定期任务,以计划在不考虑时间间隔的情况下在负载下运行。

例如,

beat_schedule = {
    'my-task': {
        'task': 'module.my_task',
        'schedule': 60.0,
    },
}
Run Code Online (Sandbox Code Playgroud)

首次开始运行节拍后,将等待60秒。

这对于较长的时间间隔(例如一个小时)是有问题的,该时间间隔可以进行立即有价值的工作,但不需要在较短的时间间隔中“新鲜”工作。

这个问题解决了这个问题,但是没有一个令人满意的答案:

  1. 因为现在将初始运行和计划分开,所以为要排队的任务增加启动延迟既不利于性能,又不利于可维护性。

  2. 在任务中重新实施时间表不利于可维护性。

在我看来,这应该是显而易见的,因此我很惊讶于我可以在此问题上找到所有这样的问题。我无法从文档和celery github问题中弄清楚这一点,所以我想知道我是否缺少明显的东西。

编辑:

这里的故事似乎还有更多,因为在以一个小时的间隔尝试执行另一项任务后,该任务在启动项目芹菜时立即运行。

如果停止并清除队列,celery purge -A proj -f然后再次启动celery,则该任务不会在心跳间隔内运行。这是有道理的,因为工作人员可以处理消息,但节拍具有自己的日程表记录celerybeat-schedule,该记录不受清除的影响。

如果我删除celerybeat-schedule并重新启动Beat,任务仍然无法运行。使用非默认时间表数据库位置启动芹菜拍子也不会导致任务运行。下一次任务运行是从我开始新节奏(14:59)起一个小时,而不是任务的首次开始时间(13:47)一个小时。

似乎有些状态记录得不好或未知,这是此问题的基础。我的问题也可以这样陈述:您如何强制击败以清除其上次跑步记录?

我还担心,在运行工人并跳动时,跑步celery -A proj inspect scheduled会给人,- empty -但大概必须在某个时间安排任务,因为它开始运行了。