Skip to content

练习 — WaitGroup · Mutex · Context

对应知识点:sync.WaitGroup · sync.Mutex · context 对应文档:docs/phase-02-core/sync-context.md 代码目录:workspace/phase-02/sync/

前置条件:完成 goroutine · channel · select 练习。


Level 1 — 基础

练习 1.1 · WaitGroup

workspace/phase-02/sync/main.go

要求

  • 启动 3 个 goroutine 模拟查询 AGV 状态(time.Sleep 模拟 IO)
  • 使用 sync.WaitGroupAdd(3)、每个 worker Done()、main Wait()
  • 全部完成后打印 "all workers done"

练习 1.2 · Mutex 保护共享状态

要求

  • 共享变量 var counter int
  • 10 个 goroutine 各执行 counter++ 1000 次
  • 无 Mutex 时运行结果不稳定;加 sync.Mutex 后结果为 10000
  • 对比 -race 检测结果(可选)

练习 1.3 · Context 取消

要求

  • ctx, cancel := context.WithCancel(context.Background())
  • worker goroutine 循环中 select 监听 <-ctx.Done()
  • main 2 秒后调用 cancel(),worker 打印退出日志

Level 2 — 应用

练习 2.1 · 并发读取 AGV 列表

要求

  • 模拟 []string{"AGV-001","AGV-002","AGV-003"}
  • 每个 ID 启动 goroutine 调用 FetchStatus(id string) (string, error)(sleep 模拟)
  • WaitGroup 等待全部完成,Mutex 保护 results []string 追加

练习 2.2 · RWMutex 读多写少

要求

  • 内存 map[string]AGVState 作为设备缓存
  • 读操作用 RLock,写操作用 Lock
  • 5 个读 goroutine + 1 个写 goroutine 并发运行
  • 注释说明 RWMutex 适用场景

练习 2.3 · Context 超时

要求

  • ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  • 模拟慢查询:FetchFromDB(ctx) 内部检查 ctx.Done()
  • 超过 5 秒返回 ctx.Err(),main 打印 timeout 错误

Level 3 — 综合

练习 3.1 · 并发请求统计

要求

  • 模拟 10 个并发 HTTP 处理(time.Sleep 随机 100–500ms)
  • WaitGroup 等待全部完成
  • Mutex 保护 successCountfailCount(随机 10% 失败)
  • 打印最终统计

练习 3.2 · 父子 Context 传播

要求

  • 父 context 带 cancel
  • 启动 3 个子 goroutine,均监听同一 ctx
  • 父 cancel 后,所有子 goroutine 在 1 秒内退出
  • 禁止 goroutine 泄漏

Level 4 — 项目实践

练习 4.1 · AGV 批量状态更新

workspace/phase-02/sync/ 实现:

要求

  • 输入:100 台 AGV 的待更新状态(可生成假数据)
  • 固定 worker 池(如 5 个 goroutine)从 jobs channel 消费
  • context.WithTimeout 整体超时 30 秒
  • WaitGroup 等待 worker 完成
  • Mutex 保护 updated []string 结果列表
  • 超时或完成后打印:成功数、失败数、耗时
  • 场景说明:数字孪生后台批量同步设备状态到 PostgreSQL 前的内存处理

学习检查

  • [ ] WaitGroup 的 Add 应在何处调用?Done 与 Wait 的关系?
  • [ ] Mutex 与 channel 如何选择(「用 channel 共享内存,还是用内存共享 channel」)?
  • [ ] Context 传值的适用场景与反模式?
  • [ ] WithTimeout 与 WithCancel 的区别?

提交方式

检查答案 — sync context 练习 X.X

学习导航

上一篇:Goroutine、Channel、Select · 对应知识文档 · 下一篇:HTTP and REST API