Apollo 技术文档Apollo 技术文档
指南
  • 架构概述
  • BigWorld 架构深度解析
  • BigWorld 进程架构与玩家生命周期
  • AOI九宫格系统详解
  • AOI广播与消息去重
  • Base 模块
  • Core 模块
  • Runtime 模块
  • Data 模块
  • Network 模块
  • /modules/actor.html
  • Game 模块
  • BigWorld 模块
服务器应用
API 参考
QA
GitHub
指南
  • 架构概述
  • BigWorld 架构深度解析
  • BigWorld 进程架构与玩家生命周期
  • AOI九宫格系统详解
  • AOI广播与消息去重
  • Base 模块
  • Core 模块
  • Runtime 模块
  • Data 模块
  • Network 模块
  • /modules/actor.html
  • Game 模块
  • BigWorld 模块
服务器应用
API 参考
QA
GitHub
  • MMORPG 架构 QA

Q80: 协程在游戏服务器中的应用场景?

核心结论

协程的核心价值,不是“语法更优雅”,而是让异步流程在不占满线程的前提下保持较好的顺序表达。

它最适合的是:

  • I/O 驱动流程
  • 多步异步状态流转
  • 需要写成顺序代码的等待链路

但它并不自动解决:

  • CPU 热点
  • 锁竞争
  • 状态归属不清

所以协程是执行模型工具,不是架构银弹。

一、协程真正适合解决什么

最典型的场景是:

  • 发起异步请求
  • 等待结果回来
  • 继续后续逻辑

如果不用协程,这类流程通常会写成:

  • 回调地狱
  • 状态机分段
  • future 链拼接

协程的价值就是把这种异步流程重新写回较自然的顺序形式。

二、游戏服务器里常见应用场景

1. 异步 I/O 流程

例如:

  • 网络请求处理
  • 数据库异步访问
  • 外部服务调用

2. 多步业务流程

例如:

  • 登录校验
  • 匹配确认
  • 副本准备到开始

这类流程天然有等待点,用协程通常比手写状态机更清晰。

3. 脚本或任务编排

如果系统有脚本层或任务流,协程也很适合表达:

  • 延迟执行
  • 等待某条件满足
  • 分阶段推进

三、协程不适合解决什么

不应把协程误当成:

  • 多核并行方案
  • CPU 优化方案
  • 共享状态问题的解法

协程本质上更偏“把等待组织得更好”,不是“让重计算 magically 更快”。

四、协程和线程不是替代关系

更准确地说:

  • 线程负责并行执行资源
  • 协程负责在一个执行上下文里组织大量挂起点

所以很多系统最终会是:

  • 少量线程
  • 每个线程上跑许多协程

五、协程最大的工程风险是什么

常见风险包括:

  • 阻塞点失控
  • 调度不可观测
  • 栈和生命周期难追踪
  • 逻辑看起来同步,实际执行是异步的

如果团队没有配套的 tracing、超时和调度观测,协程系统很容易变成难排查黑盒。

六、协程和状态归属要配合设计

协程能让代码写起来像同步,但并不改变状态所有权问题。

如果一段协程逻辑在等待期间,对象可能被:

  • 下线销毁
  • 切场景迁移
  • 超时取消

那仍然必须有:

  • 生命周期检查
  • 取消语义
  • 版本或上下文校验

七、工程上更稳妥的使用方式

常见做法是:

  • 协程主要用于 I/O 和流程编排
  • CPU 型任务仍交给线程池或专门执行器
  • 等待点必须显式、可观测
  • 与对象生命周期、取消机制配套

这样才能既享受表达力,又不把系统变得不可控。

八、常见误区

1. 协程比线程高级,所以应该全面替换

不对。它们解决的问题不同。

2. 用协程就不需要状态机

底层状态机仍然存在,只是表达方式更顺序化了。

3. 协程天然无锁

只有在状态仍保持单拥有者时,才可能减少锁需求。

参考资料

  • C++20 coroutine、async/await 与服务端流程编排实践资料
在 GitHub 上编辑此页
最后更新: 3/20/26, 6:06 AM
贡献者: cuihairu