You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

asyncio add_signal_handler无法捕获SIGINT/SIGTERM问题求助

问题原因解释

核心原因是你的业务代码阻塞了asyncio事件循环,导致事件循环没机会执行信号处理回调,分两种场景拆解:

场景1:业务里是同步无限循环

asyncio事件循环是单线程运行的,所有异步任务、信号回调都依赖这个线程的调度。如果some_code里是纯同步的无限循环(比如while True: pass),事件循环会被彻底卡死在这个循环里——它根本没法跳出去检查信号触发状态,自然也就不会执行clean_loop。

场景2:业务里是异步无限循环但未主动让出CPU

如果some_code里是异步无限循环,但循环内没有主动通过await让出CPU,问题就出在这个协程一直霸占事件循环,不给信号回调留执行机会。
asyncio是协作式调度模型,协程必须通过await操作(比如等待IO、asyncio.sleep(0))主动释放CPU,事件循环才能切换到其他任务(包括信号回调)。如果你的异步循环里全是纯计算逻辑,连最基本的await asyncio.sleep(0)都没有,或者asyncio.gather(*tasks)里的子任务全是这类“不让权”的协程,整个事件循环会被一直占用,信号处理回调永远轮不到执行。

当你注释掉这部分业务代码后,事件循环处于空闲状态,能及时检测到信号触发,clean_loop自然就能正常运行了。

内容的提问来源于stack exchange,提问作者wiggitywacker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:20:41