gpt4 book ai didi

celery - 在 Celery 任务中,retry_backoff 和 retry_backoff_max 会影响手动 self.retry() 调用吗?

转载 作者:行者123 更新时间:2023-12-04 17:39:28 27 4
gpt4 key购买 nike

所以根据docs , default_retry_delay 指定重试任务之前的时间(以秒为单位)。我只是想确保这只会影响手动调用的 self.retry() 调用,而不会影响在任务遇到预定义异常时由 Celery 触发的自动重试。

同样,我想知道 retry_backoffretry_backoff_max 是否只影响自动重试而不影响手动 self.retry()

最后,当所有这些都设置好后会发生什么?

最佳答案

这个答案可能会根据使用的 Celery 版本而改变。但是,据我检查版本 v4.3.1v4.4.7v5.0.0 的源代码, retry_backoffretry_backoff_max 仅影响自动重试。如果 autoretry_for 未设置为 True(或正整数等 True 值),则不使用退避参数。

从实现中可以看出,当autoretry_for设置为True值时,Celery使用retry_backoffretry_backoff_maxretry_jitter 参数,以便在调用 .retry 方法之前计算下一次重试的 倒计时。因此,这些 retry_xx 参数不直接被 .retry 方法使用;但是,它们会影响 countdown 的值。因此,它们仅用于 auto_retry

countdown 明确定义或通过 autoretry 计算时,default_retry_delay 的值将被忽略,如 the implementation of v5.0.0 所示.当设置了 eta 时同样有效。因此,为了能够使用 default_retry_delaycountdowneta 不应设置。此外,不应设置 autoretry_for,或者应将其设置为 False 值。

同时使用 default_retry_delayautoretry 的另一种方法是定义 autoretry 和 retry 变量;但对于手动重试调用,请将 etacountdown 显式设置为 None。一个例子:

@app.task(bind=True, default_retry_delay=360, autoretry_for=[ExternalApiError], max_retries=5, retry_backoff=1800, retry_backoff_max=8 * 3600, retry_jitter=False)
def my_task(self, data):
try:
... # some code here that may raise ExternalApiError
except SomeOtherError:
try:
self.retry(countdown=None, eta=None)
except self.MaxRetriesExceededError:
... # when maximum number of retries has been exceeded.

如果想在手动重试调用中使用backoff参数,可以使用Celery的get_exponential_backoff_interval方法实现。一个例子可能是这样的:


from celery.utils.time import get_exponential_backoff_interval

@app.task(bind=True, max_retries=5)
def my_task(self, data):
try:
... # some code here that may raise ExternalApiError
except SomeOtherError:
try:
retry_backoff = True
retry_backoff_max = 5
retry_jitter = True
countdown = get_exponential_backoff_interval(
factor=retry_backoff,
retries=self.request.retries,
maximum=retry_backoff_max,
full_jitter=retry_jitter)
)
self.retry(countdown=countdown)
except self.MaxRetriesExceededError:
... # when maximum number of retries has been exceeded.

关于celery - 在 Celery 任务中,retry_backoff 和 retry_backoff_max 会影响手动 self.retry() 调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55136705/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com