【问题标题】:Celery, calling delay with countdown芹菜,带倒计时的呼叫延迟
【发布时间】:2018-08-01 06:54:59
【问题描述】:

我正在尝试了解芹菜的工作原理

tasks.py 文件中的 django 应用程序中,我创建了一项任务:

@celery.shared_task(default_retry_delay=2 * 60, max_retries=2)
def my_task(param1, param2):
    # There are some operations

我使用以下代码调用此任务:

my_task.delay(param1, param2)

my_task 内部,有一个条件是应该再次启动此任务但延迟一分钟后

我发现有一些ETA and countdown 用于任务,但他们的例子只有apply_async

是否可以对delay 使用某种倒计时?

【问题讨论】:

    标签: python django celery django-celery


    【解决方案1】:

    来自basic part of celery Calling documentation

    delay(*args, **kwargs)
    

    发送任务消息的快捷方式,但不支持执行 选项

    所以延迟显然很方便,但是如果你想设置额外的 您必须使用 apply_async 的执行选项。

    正如文档所述,delay 不能与设置的其他选项一起使用,因此您只需将调用转换为 apply_async

    如果您想添加执行选项,文档建议您使用签名。例如:

    my_task.s(arg1, arg2).apply_async(countdown=60)
    

    【讨论】:

    • 所以你的意思是如果我称它为my_task.delay(param1, param2) 我需要使用这个:my_task.apply_async((param1, param2), countdown=60) ?
    • 不支持运行“AsyncResult”和“Signature”
    【解决方案2】:

    只是为了补充 iklinac 的答案。这就是您使用 apply_async() 调用任务的方式

    my_task.apply_async(args=(param1, param2), countdown=60)
    

    my_task.apply_async(kwargs={'param1':param1, 'param2':param2}, countdown=60)
    

    如果您使用 Flower 等工具进行监控,第二个选项将非常有用。您可以查看Celery tasks best practices 页面了解其他提示。

    【讨论】: