sys.exit(-(256 - signum))报错是Celery还是requests/sqlalchemy的问题?
问题解答
结论
这个SystemExit错误和requests、SQLAlchemy无关,属于Celery生态的问题,根源来自Celery的进程池依赖库billiard。
原因说明
你观察到网络请求、数据库查询两类完全无关的操作都抛出相同错误,本质是巧合:两类操作都是阻塞调用,刚好在执行阻塞逻辑时,Celery工作进程收到了终止信号,billiard内置的_shutdown_cleanup钩子被触发,直接调用sys.exit()抛出SystemExit异常,这个异常恰好落在了正在执行的阻塞调用栈上,所以看起来像是requests或SQLAlchemy抛出的错误。
常见触发场景
- Celery任务配置的软/硬超时时间小于请求、数据库操作的实际耗时,任务执行到对应阻塞逻辑时刚好触发超时,被worker强制终止
- Celery worker进程收到了重启、退出指令,正在运行的任务被强制清理
- 系统资源不足,内核主动杀掉了Celery工作进程
排查建议
- 检查Celery任务的
soft_time_limit、time_limit配置,确认阈值是否符合业务实际耗时要求 - 拉取错误发生时段的Celery worker日志,查看是否有任务超时、worker重启/退出的相关记录
- 可以在任务外层额外捕获
SystemExit异常做上下文打点,确认触发时的任务运行参数,缩小定位范围
内容的提问来源于stack exchange,提问作者Jaden
相关产品推荐
相关产品推荐

