以下是文档中的代码:
from celery.exceptions import SoftTimeLimitExceeded
@celery.task(soft_time_limit=15, time_limit=20)
def mytask():
try:
return do_work()
except SoftTimeLimitExceeded:
cleanup_in_a_hurry()
问题是 celery 如何捕获函数内部的异常。
如果它执行 my_task
并引发 SoftTimeLimitExceeded
,则此异常如何在函数内部传播?
另外,为什么无法在函数内捕获 TimeLimitExceeded
?
谢谢。
最佳答案
简而言之,Celery 通过信号中断您的任务并引发 SoftTimeLimitExceeded
。
请注意,可以通过几种不同的方式配置 Celery 来运行任务(例如线程),但我的答案仅限于进程池。在这种情况下,您的任务正在工作线程的子进程之一中执行。创建这些池进程时,Celery 会注册一个信号处理程序来处理 SIGUSR1
信号。超时后,将发送 SIGUSR1
。这会中断您的任务:无论它们在 Python 字节码执行中的哪个位置,它们都会停止,将 Celery 的信号处理程序添加到其堆栈帧中,并执行 Celery 的处理程序,从而引发 SoftTimeLimitExceeded
。异常会在堆栈帧中向上传播(请注意,这将是中断发生时您的任务所在的位置),直到它被捕获(可能被您的任务代码捕获)。
关于Celery SoftTimeLimitExceeded 和 TimeLimitExceeded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66607220/