try:
await job()
except asyncio.CancelledError:
cleanup()
raise
服务停机时等待任务退出,等满三十秒还没结束,日志里能看到那条协程仍在重试循环里打转,取消信号像是根本没送到。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:新版本里 CancelledError 继承自 BaseException,已经不在 Exception 这棵树下,except Exception 根本抓不到它,可代码里写了裸 except 或者更宽泛的捕获,取消就被吞掉继续跑,进程只能干等。
这次卡住的地方就在「协程取消被吞」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
处理上按这个顺序:把裸 except 改成明确列出的异常类型,别想着一把全抓;确实要捕获取消的,处理完必须重新抛出,不能悄悄返回;清理逻辑统一写在 finally 里,别在 except 块中顺手把取消吞掉。
确认没问题再收工,停机时任务在几秒内退出,日志中出现一次明确的取消记录,不再空等。
