未来方向 C++协程+线程混合模型 c++ web框架paozhu做到了
从 Paozhu 这个仓库的设计来看,C++ Web 框架的并发模型大致有三条路线,可以结合它的实现来谈哪种更有前途。
三种主流方式
1. 纯线程池(每请求一线程 / 同步阻塞)
- 实现简单,业务代码顺序书写,但线程数受内存和上下文切换限制,高并发下吞吐见顶。
- Paozhu 里被
#if 0注释掉的旧通路ThreadPool::http_clientrun就是这种:整条路由链在业务线程同步跑完,唤醒点不在会话 strand 上,且池拒单时协程会永久挂起——这正是它被替换掉的原因。 0-cite-0
2. 纯协程(全链路 co_await)
- 性能上限最高,但要求所有库(DB 驱动、第三方 SDK)都是异步的,现实中 C++ 生态大量同步库会让协程被阻塞调用卡死。
3. 混合双池:I/O 协程池 + 用户代码线程池(Paozhu 采用的方式)
- I/O 层用 Asio
io_context+ C++20co_await跑非阻塞网络收发;同步业务函数通过co_pool_run_step投到clientrunpool线程池执行,完成后用asio::dispatch把续体唤醒回会话自己的 strand。 0-cite-1 - 官方定位是"类似 Go 的调度,只针对 HTTP 请求"。 0-cite-2
- 关键细节:池拒单时以
rejected=true就地完成 awaitable,避免协程永久挂起、peer 和 h2 stream 泄漏。 0-cite-3
哪种有未来
客观判断:混合模型是目前 C++ 生态下最务实的方向,理由:
- C++ 不像 Go/Rust 有统一的异步运行时,第三方库大多是同步的。纯协程框架(如 Drogon 的协程模式)在调用同步 DB 驱动时照样阻塞 event loop,双池架构天然规避了这个问题。
- C++20
co_await已是标准,Asio 协程成熟,I/O 侧协程化没有技术障碍。 - Paozhu 的演进本身就是证据:它从"整链同步跑"迁移到了
router::co_resolve+co_pool_run_step的逐步池化模型,说明纯线程池路线在框架内部已被淘汰。 0-cite-4
但也要说明局限:双池模型每次同步步骤都有入队/唤醒开销,极致 QPS 场景(如 TechEmpower 榜首类框架)仍是全异步无阻塞占优。如果业务主要是 IO 密集 + 同步库多,双池是正确选择;如果追求极限性能且依赖链全异步可控,纯协程上限更高。
结论:对绝大多数业务场景,"协程做 I/O + 线程池跑同步业务"的混合调度是 C++ Web 框架更有未来的方式——它兼容现有同步生态,又拿到了协程的并发能力,Paozhu 的架构演进也印证了这个方向。

浙公网安备 33010602011771号