如何在外部 JSON/YAML 文件中定义 Celery Crontab 计划?

问题描述 投票:0回答:2

Celery 允许通过向

app.conf.beat_schedule
添加条目来定义计划任务。一个例子(基于链接

app.conf.beat_schedule = {
    # Executes every Monday morning at 7:30 a.m.
    'do-task-every-monday-morning': {
        'task': 'tasks.monday_morning_task',
        'schedule': crontab(hour=7, minute=30, day_of_week=1),
        'args': (18, 24),
    },
}

有没有办法在外部 JSON 文件中定义计划任务并将该文件加载到 Celery 中?例如,

{
    "do-task-every-monday-morning": {
        "task": "tasks.monday_morning_task",
        "schedule": "30 7 * * 1",
        "args": [18, 24]
    },
    "do-task-every-friday-afternoon": {
        "task": "tasks.friday_afternoon_task",
        "schedule": "30 14 * * 5"
    }
}

如有任何帮助,我们将不胜感激。

提前致谢。

python celery
2个回答
0
投票

crontab(hour=7, minute=30, day_of_week=1),
部分是一个函数调用,所以你不能只用 JSON 编写它并解析 json 以使其在 Python 代码中工作。

您需要添加一个中间步骤,通过调用

"30 7 * * 1"
函数将计划语法
crontab
解析为一个值,然后在
schedule
键上设置该值。

对于

'args': (18, 24),
部分,您也会遇到类似的问题,因为 python 元组
(18, 24)
没有相应的 JSON,所以即使您在 JSON 文件中写入
[18, 24]
,您也必须使用自己的代码解释它并转换进入元组。

有人可能已经这样做了,因此值得在 Github 或其他地方搜索代码,但这并不是一项艰巨的实施工作。


0
投票

在 celery 调度中转换字符串确实非常简单:

>>> from celery.schedules import crontab
>>> string = '0 0 * * *'
>>> crontab(*string.split())
<crontab: 0 0 * * * (m/h/dM/MY/d)>
© www.soinside.com 2019 - 2024. All rights reserved.