首页/ 学科题库/ golang/ GO并发编程专题
golang 专题精讲

GO并发编程专题

1 篇文章 24 道配套习题

GO并发编程专题

专题说明

本专题系统讲解Go语言并发编程的核心技术,从goroutine轻量级线程原理到GMP调度模型,从channel通信机制到sync同步原语,从context上下文控制到常见并发设计模式,全面覆盖并发编程知识点,帮助开发者编写高效、安全的高并发程序。

学习目标

  1. 理解goroutine与操作系统线程的本质区别及创建方式
  2. 掌握GMP调度模型的工作原理和调度策略
  3. 熟练使用channel进行goroutine间通信和同步
  4. 掌握sync包提供的同步原语(Mutex、WaitGroup、Once等)
  5. 理解context的传播规则和取消机制
  6. 应用常见并发模式(Worker Pool、Pipeline、Fan-out/Fan-in等)
  7. 掌握竞态检测工具的使用方法

学习内容

本专题涵盖以下核心知识点:

Goroutine基础

  • goroutine创建语法(go关键字)
  • goroutine与系统线程的区别
  • goroutine初始栈大小与动态增长
  • 主goroutine退出对其他goroutine的影响

GMP调度模型

  • G(Goroutine)、M(Machine)、P(Processor)概念
  • 本地运行队列与全局运行队列
  • 工作窃取(Work Stealing)机制
  • 抢占式调度演进历史

Channel通信机制

  • 无缓冲channel与有缓冲channel
  • channel方向类型(双向、只发送、只接收)
  • channel关闭规则与检测方法
  • select多路复用机制

Sync同步原语

  • sync.Mutex互斥锁使用规则
  • sync.RWMutex读写锁场景选择
  • sync.WaitGroup等待goroutine完成
  • sync.Once单次执行

Context上下文控制

  • context.Background()根节点
  • WithCancel、WithTimeout、WithDeadline
  • context传播与取消规则
  • context在HTTP服务中的应用

常见并发模式

  • Worker Pool工作池模式
  • Pipeline管道模式
  • Fan-out/Fan-in扇出扇入模式
  • 优雅退出模式

竞态检测与调试

  • race detector使用方法
  • 数据竞争定义与检测
  • go vet静态分析工具

学习建议

  1. 理解原理:先掌握GMP调度模型,理解goroutine轻量级特性
  2. 实践验证:使用race detector验证并发代码安全性
  3. 模式应用:在实际项目中应用Worker Pool等设计模式
  4. 调试技巧:熟练使用pprof goroutine profile排查阻塞问题

配套习题(24 题)

参考答案在文末
判断题
1
判断题

channel可以多次调用close函数进行关闭。

A

对

B

错

2
判断题

goroutine是操作系统线程,由操作系统内核调度。

A

对

B

错

3
判断题

当主goroutine执行完毕退出时,其他正在运行的goroutine也会立即终止。

A

对

B

错

4
判断题

context.Background()是所有context树的根节点,通常作为顶层context使用。

A

对

B

错

单选题
5
单选题

Go的GMP调度模型中,P(Processor)的数量默认等于什么?

A

CPU核心数的一半

B

CPU核心数

C

goroutine的数量

D

操作系统线程的数量

6
单选题

实现goroutine的优雅退出(Graceful Shutdown),最推荐使用哪种机制?

A

使用全局变量作为退出标志

B

使用专门的退出channel传递信号

C

使用context.Context控制goroutine生命周期

D

使用runtime.Goexit()强制终止

7
单选题

Go语言中创建一个新的goroutine使用哪个关键字?

A

async

B

go

C

spawn

D

create

8
单选题

Go的竞态检测器通过哪个标志启用?

A

-gcflags='-race'

B

-race

C

-detect-race

D

-debug race

9
单选题

Go的sync包中,用于等待一组goroutine完成的是哪个类型?

A

sync.Mutex

B

sync.RWMutex

C

sync.WaitGroup

D

sync.Once

10
单选题

Go中使用select语句处理多个channel的主要目的是?

A

同时监听多个channel的读写操作

B

创建多个goroutine

C

替代Mutex进行同步

D

实现管道过滤

11
单选题

创建一个可以手动取消的context,应该使用哪个函数?

A

context.WithTimeout()

B

context.WithDeadline()

C

context.WithCancel()

D

context.WithValue()

12
单选题

无缓冲channel(unbuffered channel)的主要特点是?

A

可以存储多个值,发送不会阻塞

B

发送和接收必须同时准备好才能完成

C

接收操作总是先于发送操作完成

D

只能用于单向通信

13
单选题

Worker Pool并发模式的主要优势是?

A

实现goroutine之间的数据传递

B

控制并发goroutine的数量,避免资源耗尽

C

实现goroutine的优先级调度

D

自动处理goroutine的错误

多选题
14
多选题

关于Go的channel方向类型,以下说法正确的是?

A

chan<- T表示只发送channel,只能向其发送数据

B

<-chan T表示只接收channel,只能从中接收数据

C

将双向channel转换为单向channel是允许的

D

单向channel可以反向使用(只发送channel可以接收)

E

单向channel常用于函数参数,约束channel使用方式

15
多选题

关于sync.Mutex的正确使用,以下说法正确的是?

A

Lock之后必须调用Unlock释放锁

B

可以使用defer确保Unlock一定执行

C

Mutex可以被复制传递给其他goroutine

D

未加锁时调用Unlock会导致panic

E

同一个goroutine可以重复Lock同一Mutex

16
多选题

关于Go的Pipeline(管道)并发模式,以下说法正确的是?

A

Pipeline由多个处理阶段串联组成

B

每个阶段是一个goroutine,通过channel连接

C

Pipeline可以实现数据的流式处理

D

每个阶段可以并行处理多个数据项

E

Pipeline的每个阶段必须等待上一阶段完全完成才能开始

17
多选题

关于Go的select语句行为,以下说法正确的是?

A

当多个case同时可执行时,select会随机选择一个执行

B

如果没有case可执行且没有default,select会阻塞

C

select中的case顺序会影响选择优先级

D

可以在for循环中使用select实现持续监听

E

select可以用于实现goroutine的优雅退出

18
多选题

关于Go的context传播和取消规则,以下说法正确的是?

A

子context取消不会影响父context

B

父context取消会导致所有子context取消

C

context取消信号通过Done() channel传递

D

context.Err()可以获取取消原因(Canceled或DeadlineExceeded)

E

context应该在请求边界创建,不要长期保存

19
多选题

关于Go调度器的调度策略,以下说法正确的是?

A

Go采用协作式调度,goroutine需要主动让出CPU

B

Go调度器实现了工作窃取(Work Stealing)机制

C

goroutine进行系统调用时可能导致M阻塞

D

Go调度器在函数调用时会检查是否需要让出CPU

E

网络poller可以让goroutine在不阻塞M的情况下等待网络I/O

20
多选题

以下哪些情况会被Go的race detector检测为数据竞争?

A

多个goroutine同时读取同一个变量

B

一个goroutine写入,另一个goroutine读取同一变量(无同步)

C

多个goroutine同时写入同一变量(无同步)

D

使用atomic操作访问共享变量

E

通过channel传递共享变量的指针

填空题
21
填空题

创建channel使用 函数,语法为 。发送数据使用 语法,接收数据使用 值 := <-ch 语法。关闭channel使用 close 函数。

22
填空题

sync.WaitGroup提供了三个核心方法: 用于增加等待计数, 用于减少计数(通常配合defer使用), 用于阻塞等待计数归零。调用 Add 必须在goroutine启动之前完成。

23
填空题

Go调度器使用 模型,其中G代表 ,M代表 ,P代表 逻辑处理器。每个P维护一个 本地运行队列,最多可容纳 256 个goroutine。

24
填空题

创建goroutine使用 关键字,后面紧跟函数调用。goroutine的初始栈大小约为 ,由 调度而非操作系统。可以使用 runtime.Gosched 主动让出CPU。

参考答案
1.错误 2.错误 3.正确 4.正确 5.B 6.C 7.B 8.B 9.C 10.A 11.C 12.B 13.B 14.A;B;C;E 15.A;B;D 16.A;B;C;D 17.A;B;D;E 18.A;B;C;D;E 19.B;C;D;E 20.B;C 21.make;make(chan 类型, 缓冲大小);ch <- 值 22.Add;Done;Wait 23.GMP;goroutine;操作系统线程 24.go;2KB;Go运行时
想在手机上刷这套专题的真题?
使用微信 卷王开发者小程序/App,首页顶部扫一扫识别二维码,即可解锁本专题全部配套练习与错题本。
了解产品 App
← 上一个专题 GO工程化与工具链专题 下一个专题 → GO接口设计与最佳实践专题