当前位置: 首页 > 面试题库 >

重试celery任务并以指数方式退回

严亮
2023-03-14
问题内容

对于这样的任务:

from celery.decorators import task

@task()
def add(x, y):
    if not x or not y:
        raise Exception("test error")
    return self.wait_until_server_responds(

如果它引发异常,而我想从守护程序端重试,如何应用指数回退算法,例如,2^2, 2^3,2^4等数秒后?

还可以从服务器端维护重试,以便如果工作进程被杀死,那么产生的下一个工作进程将执行重试任务?


问题答案:

task.request.retries属性包含到目前为止的尝试次数,因此您可以使用它来实现指数补偿:

from celery.task import task

@task(bind=True, max_retries=3)
def update_status(self, auth, status):
    try:
        Twitter(auth).update_status(status)
    except Twitter.WhaleFail as exc:
        self.retry(exc=exc, countdown=2 ** self.request.retries)

为防止雷电群问题,您可以考虑在指数补偿中添加随机抖动:

import random
self.retry(exc=exc, countdown=int(random.uniform(2, 4) ** self.request.retries))


 类似资料:
  • 问题内容: 我目前正在将celery与django结合使用,并且一切正常。 但是,如果服务器超载,我希望能够通过检查当前计划了多少个任务,使用户有机会取消任务。 我怎样才能做到这一点? 我正在使用Redis作为代理。 这在某种程度上与我的问题有关,但是我不需要列出任务,只需数一下它们即可:) 问题答案: 如果您的代理配置为,并且您的任务已提交到常规队列,则可以通过以下方式获得长度: 或者,从she

  • null 有没有一种方法可以在Spring RestTemplate中使用指数退避?

  • 问题内容: 如何从任务中获取任务的task_id值?这是我的代码: 这个想法是,当我创建任务的新实例时,我从任务对象中检索。然后,我使用任务ID来确定任务是否已完成。我 不想 按值跟踪任务,因为在任务完成后文件将被“清理”,并且可能存在也可能不存在。 在上面的示例中,我将如何获取值? 问题答案: 如果任务接受,Celery会设置一些默认关键字参数。(您可以使用** kwargs接受它们,也可以专门

  • 问题内容: 我刚刚发现了有关配置选项(docs)的信息。默认值为4,但是(我相信)我希望预取尽可能少。我现在将其设置为1,这与我要查找的值足够接近,但是仍有一些我不理解的地方: 为什么这样预取一个好主意?我并没有真正找到原因,除非消息队列和工作线程之间存在大量延迟(就我而言,它们当前正在同一主机上运行,​​最糟糕的是最终可能在同一数据中的不同主机上运行)中央)。该文档仅提到了缺点,但没有解释优点是

  • 我有一个要求,如果我从消息驱动bean调用的服务(Restful服务)关闭或没有返回成功,我需要将消息回滚到队列,等待一段时间(指数),然后再次从队列读取消息,并尝试连接到服务。 我正在尝试的是: 在方法中,如果我从调用Restful服务的服务接收到异常,我将使用我可以执行类似于; 但是如何确保以指数级增长? 也许我需要保持豆子的状态,但有人能建议我怎么做吗?

  • 问题内容: 我使用celery更新新闻聚合站点中的RSS feed。我为每个提要使用一个@task,看起来一切正常。 有一个细节我不确定如何处理:所有提要每分钟都使用@periodic_task更新一次,但是如果提要仍在启动新任务时从上一个定期任务更新,该怎么办?(例如,如果Feed确实很慢或离线,并且任务在重试循环中进行) 目前,我存储任务结果并按以下方式检查其状态: 也许我错过了一些使用芹菜机