Celery SoftTimeLimitExceeded 和 TimeLimitExceeded

标签 celery django-celery celery-task

以下是文档中的代码:

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/

相关文章:

python - 当 SQLAlchemy 事件触发 Celery 任务时连接关闭

django - 使用 Celery 运行具有不同优先级的相同任务

python - 如何在 Celery worker 中正确连接到 mongodb?

python - 如何重启由 Supervisord 运行的 Celery Worker

python - Celery - 没有名为 'celery.datastructures' 的模块

python - 获取线程中任意位置的当前 celery 任务 ID

python - celery 任务状态总是挂起

python - Celery 在将我的查询集 obj 作为参数传递时引发错误

django - 从 celery worker 到普罗米修斯的自定义指标

websocket - 如何在 celery 中为 Tornado 中的 websocket 请求启动任务?