Django + Celery:如何将带有参数的任务链接到周期性任务

Posted

技术标签:

【中文标题】Django + Celery:如何将带有参数的任务链接到周期性任务【英文标题】:Django + Celery: how to chain tasks with parameters to periodic task 【发布时间】:2016-06-17 06:24:37 【问题描述】:

我已经配置了 Django + Celery:一切正常,我可以执行从 views.py 调用的任务,即mul.apply_async((2, 5), queue='celery', countdown=5)

我需要调度周期性任务,它将简单任务与用户传递的参数链接起来。 我阅读了文档http://docs.celeryproject.org/en/latest/userguide/canvas.html 并且知道如何链接,我知道如何在没有参数的情况下进行周期性任务@periodic_task(run_every=(crontab(hour="*", minute="*", day_of_week="*")))

但是如何结合呢?

我想要的工作流程:

    用户使用参数创建项目。使用该参数执行了 5 个任务。 然后我需要 shedule 每 24 小时重复所有 5 项任务。所以在这里我不知道如何传递参数(它们保存到数据库)。

在其他答案中,我看到了这种语法:

CELERYBEAT_SCHEDULE = 
# crontab(hour=0, minute=0, day_of_week='saturday')
'schedule-name':   # example: 'file-backup' 
    'task': 'some_django_app.tasks....',  # example: 'files.tasks.cleanup' 
    'schedule': crontab(...)
    'args': (2, 3)
,

但这里的问题是它位于 Django 的 settings.py 而不是 tasks.py,我无法动态传递 args。

【问题讨论】:

【参考方案1】:

您注册的 celerybeat 任务可以是一个包装器,并在其中执行项目/任务逻辑,并根据需要触发其他任务。您可以在 celery beat 工作中获取项目任务。

CELERYBEAT_SCHEDULE.task -> 'some_django_app.project_beat_task'

然后项目节拍任务可以检索正确的项目以及与之关联的所有任务,可能会为每个项目生成一系列任务

【讨论】:

以上是关于Django + Celery:如何将带有参数的任务链接到周期性任务的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 项目中将请求传递给 Celery 任务参数?

如何在 Django-Celery 失败的情况下设置重试任务

如何让celery接受定制的参数

第一个带有 Celery 的 Django cron

带有 Celery 的 Django - 未找到现有对象

如何将自定义模型添加到 django celery