外观
练习 — 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.WaitGroup:Add(3)、每个 workerDone()、mainWait() - 全部完成后打印
"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 保护
successCount和failCount(随机 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