如何处理celery中的TimeoutError

2 投票
2 回答
5794 浏览
提问于 2025-04-19 03:03

我使用了几个 task.apply_async()task.get() 来异步调用服务器,并让客户端等待结果。这些任务返回结果的时间不固定,有时需要1分钟,有时需要3分钟才能完成。

我想要检测任务是否出现了 TimeError,因为服务器可能宕机了,导致请求无法处理或发送。使用 apply_async 调用时设置超时是处理这些错误的唯一方法吗?还有其他方法吗?

2 个回答

1
  1. 工作端

在工作端处理时间时,可以使用软限制和硬限制:http://celery.readthedocs.org/en/latest/userguide/workers.html#time-limits

如果任务超出了这个时间限制,就会抛出一个错误。然后你可以捕捉到这个异常:

try:
    task.apply_async().get()
except TimeLimitExceeded as err:
    pass
  1. 客户端

在客户端捕捉时间错误时,可以使用 get(timeout=value) 方法,如下所述。

try:
  task.apply_async().get(timeout=90)
except TimeoutError as err:
   pass
1

答案在于调用的 get 方法。它有一个参数是 get(timeout=value)。

http://celery.readthedocs.org/en/latest/reference/celery.result.html

撰写回答