【问题标题】:How to make celery retry using the same worker?如何使用同一个工人重试芹菜?
【发布时间】:2012-02-03 21:50:09
【问题描述】:

我刚开始在 Django 项目中使用 celery,并且有点陷入这个特殊问题:基本上,我需要将长期运行的任务分配给不同的工作人员。该任务实际上分为几个步骤,每个步骤都需要相当长的时间才能完成。因此,如果某个步骤失败,我希望 celery 使用同一个工作人员重试此任务,以重用已完成步骤的结果。我知道 celery 使用路由将任务分配到某些服务器,但我找不到关于这个特定问题的任何信息。我使用 RabbitMQ 作为我的代理。

【问题讨论】:

    标签: python django rabbitmq celery


    【解决方案1】:

    你可以让每个 celeryd 实例从一个以 worker 的主机名命名的队列中消费:

    celeryd -l info -n worker1.example.com  -Q celery,worker1.example.com
    

    将主机名设置为worker1.example.com,并将从同名队列以及默认队列(名为celery)中消费。

    然后将任务定向到您可以使用的特定工作人员:

    task.apply_async(args, kwargs, queue="worker1.example.com")
    

    类似于直接重试:

    task.retry(queue="worker1.example.com")
    

    或将重试定向到同一个工作人员:

    task.retry(queue=task.request.hostname)
    

    【讨论】:

    • 非常感谢您的回答!我认为这正是我正在寻找的。我没有意识到我们可以将队列名称传递给 retry(),但现在它很有意义:)
    • 在windows上使用%computername%,在linux上使用`hostname`来构建命令行。
    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2012-04-03
    • 2021-10-24
    • 2015-05-13
    • 2014-08-17
    • 2012-08-07
    • 2017-05-25
    相关资源
    最近更新 更多