【问题标题】:celerybeat automatically disables periodic taskcelerybeat 自动禁用周期性任务
【发布时间】:2023-06-25 00:38:01
【问题描述】:

我想使用 django-celery 的管理界面为 celery 创建一个周期性任务。我有一个任务设置,当手动或通过脚本调用时运行良好。它只是不能通过 celerybeat 工作。根据调试日志,第一次检索时任务设置为enabled = False,我想知道为什么。

当添加周期性任务并将[1, False] 作为位置参数传递时,该任务会自动禁用,我看不到任何进一步的输出。添加不带参数时,任务会被执行,但会立即引发异常,因为我没有提供所需的参数(有道理)。

有人知道这里有什么问题吗?

提前致谢。

这是提供参数后的输出:

[DEBUG/Beat] SELECT "djcelery_periodictask"."id", [...] 
             FROM "djcelery_periodictask" 
             WHERE "djcelery_periodictask"."enabled" = true ; args=(True,)

[DEBUG/Beat] SELECT "djcelery_intervalschedule"."id", [...] 
             FROM "djcelery_intervalschedule" 
             WHERE "djcelery_intervalschedule"."id" = 3 ; args=(3,)

[DEBUG/Beat] SELECT (1) AS "a" 
             FROM "djcelery_periodictask" 
             WHERE "djcelery_periodictask"."id" = 3  LIMIT 1; args=(3,)

[DEBUG/Beat] UPDATE "djcelery_periodictask" 
             SET "name" = E'<taskname>', "task" = E'<task.module.path>', 
                 "interval_id" = 3, "crontab_id" = NULL, 
                 "args" = E'[1, False,]', "kwargs" = E'{}', "queue" = NULL, 
                 "exchange" = NULL, "routing_key" = NULL, 
                 "expires" = NULL, "enabled" = false, 
                 "last_run_at" = E'2011-05-25 00:45:23.242387', "total_run_count" = 9, 
                 "date_changed" = E'2011-05-25 09:28:06.201148' 
             WHERE "djcelery_periodictask"."id" = 3; 
             args=(
                   u'<periodic-task-name>', u'<task.module.path>', 
                   3, u'[1, False,]', u'{}', 
                   False, u'2011-05-25 00:45:23.242387', 9, 
                   u'2011-05-25 09:28:06.201148', 3
             )

[DEBUG/Beat] Current schedule:
<ModelEntry: celery.backend_cleanup celery.backend_cleanup(*[], **{}) {<crontab: 0 4 * (m/h/d)>}
[DEBUG/Beat] Celerybeat: Waking up in 5.00 seconds.

编辑: 它适用于以下设置。我仍然不知道为什么它不适用于 django-celery

CELERYBEAT_SCHEDULE = {
    "example": {
        "task": "<task.module.path>",
        "schedule": crontab(),
        "args": (1, False)
    },
}

【问题讨论】:

  • 你能发布你的任务和周期性任务配置吗?
  • 感谢您了解我的问题。我没有设置CELERYBEAT_SCHEDULE,因为我使用了 django-celery 的管理。我还检查了FAQ,但正如我在原始帖子中所说,我可以手动从 shell 启动任务。还有什么我可以忽略的吗?
  • 遇到完全相同的问题...有什么解决办法吗?
  • 你试过用CELERYBEAT_SCHEDULE设置settings.py中的任务吗?
  • 是的,它适用于 CELERYBEAT_SCHEDULE。但我需要它与 django 管理员一起工作。

标签: django celery django-celery celeryd


【解决方案1】:

我遇到了同样的问题。确保参数是 JSON 格式的。例如,尝试将位置 args 设置为 [1, false] -- 小写 'false' -- 我刚刚在 django-celery 实例(版本 2.2.4)上对其进行了测试,并且成功了。

对于关键字 args,使用类似 {"name": "aldarund"}

【讨论】:

  • 是的,我确认,问题出在编码上。事实上,对于字符串参数,您必须使用双引号 " 而不是单引号 '。
【解决方案2】:

我也遇到了同样的问题。

与 djcelery 中的 PeriodicTask 模型的描述(“JSON 编码的位置参数”),与 Evan 的回答相同。我尝试在保存之前使用 python json lib 进行编码。

这和我一起工作

import json 
o = PeriodicTask()
o.kwargs = json.dumps({'myargs': 'hello'})
o.save()

芹菜版本 3.0.11

【讨论】:

    【解决方案3】:
    CELERYBEAT_SCHEDULE = {
        "example": {
            "task": "<task.module.path>",
            "schedule": crontab(),
            "enable": False
        },
    }
    

    我试过了,它成功了。我在 celery beat v5.1.2 上运行

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    最近更新 更多