【问题标题】:Celery - Django Schedule task from inside a scheduled taskCelery - 来自计划任务内部的 Django 计划任务
【发布时间】:2023-08-23 17:53:01
【问题描述】:

我有一个使用 apply_async 方法安排的任务(我们称之为 MainTask),该任务有一些验证可以触发另一个使用 eta 安排的任务(SecondaryTask)。

每次 MainTask 尝试使用 apply_async 方法调度 SecondaryTask 时,SecondaryTask 都会立即运行,覆盖 eta 参数。

如何使用eta 安排与“主任务”不同的任务并稍后执行?

下面是代码示例:

views.py

def function():
    main_task.apply_async(eta=some_day)

tasks.py

@app.task(bind=True, name="main_task", autoretry_for=(Exception,), default_retry_delay=10, max_retries=3, queue='mail')
def main_task(self):
    ...
    if something:
        ...
        another_task.apply_async(eta=tomorrow)

@app.task(bind=True, name="another_task", autoretry_for=(Exception,), default_retry_delay=10, max_retries=3, queue='mail')
    def another_task(self):
        do_something()

我正在使用 Celery 4.4.6 顺便说一句

【问题讨论】:

    标签: django celery django-celery celery-task


    【解决方案1】:

    你用的是哪个 celery 版本?

    我使用的是 4.4.7 并使用 countdown,这类似于 same(也许 eta 存在错误?):

    倒计时是将 ETA 设置为未来几秒的快捷方式。

    假设你正在做类似的事情:

    tomorrow = datetime.utcnow() + timedelta(days=1)
    

    您始终可以获得秒数并与countdown 一起使用:

    seconds = timedelta(days=1).total_seconds()
    another_task.apply_async(countdown=seconds)
    

    编辑

    您可以尝试在signature 上发送apply_async 看看是否会有所不同?

    another_task.si().apply_async(eta=tomorrow)
    

    【讨论】:

    • 我使用的是 Celery 4.4.6,问题是“apply_async” 没有安排新任务,它像“apply” 一样立即执行任务。使用 eta 或倒计时没有变化
    • 你尝试过 delay() 吗?
    • + 见我上面的编辑
    最近更新 更多