第5章 并发编程:goroutine、channel与同步


第5章 并发编程:goroutine、channel 与同步

章节摘要:这是 Go 的主场。本章从"并发与并行的区别"讲起,覆盖 goroutine 的启动成本与调度模型(GMP)、channel 的阻塞语义与缓冲设计、select 的多路复用与超时模式、sync 包的锁族与 WaitGroup、Once、原子操作,最后用 Context 打通"取消传播"这一生产系统的命脉。读完你能写出正确且不泄漏的并发程序。

本节导航

阅读完本章,你应当能够:

  1. 解释并发与并行、goroutine 与线程的区别;
  2. 用 channel 实现同步、数据传递与并发度控制;
  3. 用 select 做超时、非阻塞与多路复用;
  4. 在 Mutex、RWMutex、WaitGroup、Once 之间正确选型;
  5. 用 Context 实现超时与取消的全链路传播;
  6. 识别并修复 goroutine 泄漏与数据竞争。

核心概念速览

Don't communicate by sharing memory; share memory by communicating——别用共享内存来通信,用通信来共享内存。

子章节导航

5.1 Goroutine 与调度

go 关键字、主 goroutine 退出即程序退出、GMP 调度模型、泄漏的成因。

5.2 Channel

无缓冲的同步语义、有缓冲的异步语义、关闭与遍历、单向通道与高级模式(信号、扇入扇出、退出)。

5.3 select 语句

多路复用、随机公平选择、超时与非阻塞模式、nil 通道的妙用、与 Context 联动。

5.4 同步原语

数据竞争的本质、Mutex 与 RWMutex、WaitGroup、Once、Cond 与原子操作、错误用法清单。

5.5 Context

接口构成、四种派生、取消与超时传播、Value 的克制使用、惯例与反模式。

子章节之间的逻辑关系

goroutine 是"执行",channel 是"通信",select 是"通信的调度台",sync 族是"共享内存时的护栏",Context 是"跨层取消的信令网"。五者按此顺序递进,最后在"生产级并发模式"里合流。

┌────────────┐ ┌────────────┐ ┌────────────┐ │ goroutine │─▶ │ channel │─▶ │ select │ │ 谁在干活 │ │ 怎么传话 │ │ 听谁的 │ └────────────┘ └────────────┘ └─────┬──────┘ ┌────────────┐ ┌────────────┐ │ │ sync 锁族 │─▶ │ Context │◀────────┘ │ 共享护栏 │ │ 全链路取消 │ └────────────┘ └────────────┘ ​

前置知识与后续延伸

  • 前置:闭包与引用捕获(第 2 章)、指针与共享(第 3 章)、接口(第 3 章)。
  • 为后续铺垫:第 6 章测试并发代码、反射在并发工具中的应用;所有网络编程实战都建立在本章之上。

本章学习建议

并发是 Go 最容易写出"看起来对、跑起来随机出错"代码的地方。学习时坚持两条纪律:第一,每个 goroutine 都用 WaitGroup 或 channel 明确"谁会等它结束";第二,用 go test -race 跑竞态检测,把数据竞争当作编译错误一样对待。建议按"顺序执行 → 并发改造 → 加超时与取消"三步完成一个爬虫小项目,逐步体会 select 与 Context 的价值。

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U