拆开 Hical:为什么不用每个连接一个 timer 协程?IdleScanner 集中式空闲扫描设计
[Hical] 为什么不用每个连接一个 timer 协程?IdleScanner 的集中式空闲扫描设计 本专栏文章:拆开 Hical · 第 5 篇 本篇讲一个大多数 HTTP 框架都有的、但很少被拿出来单独聊的功能:空闲连接超时断开。 功能本身不复杂——如果一个 keep-alive 连接 60 秒没有新请求,就关掉它。但"怎么实现"有两种完全不同的路线,方案选择直接影响内存和 CPU 成本。 1. 方案 A:每连接一个 timer 协程(大多数框架的做法) 1 2 3 4 5 6 7 8 9 为每个连接创建一个 steady_timer,然后 co_await 在它上面: co_spawn(io_context, [self]() -> Awaitable<void> { steady_timer timer(60s); auto result = co_await (timer.async_wait() || socket.async_read(...)); // 如果 timer 先到 → 超时关闭 // 如果 socket 先到 → 取消 timer,处理请求 }); 问题在哪? ...