全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📝 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
单选题

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

A

async

B

go

C

spawn

D

create

2
判断题

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

A

B

3
判断题

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

A

B

4
单选题

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

A

sync.Mutex

B

sync.RWMutex

C

sync.WaitGroup

D

sync.Once

5
多选题

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

A

Lock之后必须调用Unlock释放锁

B

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

C

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

D

未加锁时调用Unlock会导致panic

E

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

6
填空题

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

7
单选题

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

A

CPU核心数的一半

B

CPU核心数

C

goroutine的数量

D

操作系统线程的数量

8
多选题

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

A

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

B

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

C

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

D

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

E

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

9
填空题

Go调度器使用 ______ 模型,其中G代表 _________,M代表 ____________,P代表 __________。每个P维护一个 ____________,最多可容纳 ______ 个goroutine。

10
单选题

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

A

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

B

创建多个goroutine

C

替代Mutex进行同步

D

实现管道过滤

11
多选题

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

A

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

B

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

C

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

D

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

E

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

12
单选题

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

A

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

B

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

C

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

D

只能用于单向通信

13
判断题

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

A

B

14
多选题

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

A

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

B

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

C

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

D

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

E

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

15
填空题

创建channel使用 ______ 函数,语法为 ________________________。发送数据使用 ___________ 语法,接收数据使用 _____________ 语法。关闭channel使用 ______ 函数。

16
单选题

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

A

实现goroutine之间的数据传递

B

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

C

实现goroutine的优先级调度

D

自动处理goroutine的错误

17
多选题

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

A

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

B

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

C

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

D

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

E

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

18
单选题

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

A

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

B

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

C

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

D

使用runtime.Goexit()强制终止

19
单选题

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

A

context.WithTimeout()

B

context.WithDeadline()

C

context.WithCancel()

D

context.WithValue()

20
多选题

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

A

子context取消不会影响父context

B

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

C

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

D

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

E

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

21
判断题

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

A

B

22
单选题

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

A

-gcflags='-race'

B

-race

C

-detect-race

D

-debug race

23
多选题

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

A

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

B

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

C

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

D

使用atomic操作访问共享变量

E

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

24
填空题

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

← 上一个专题 GO工程化与工具链专题
下一个专题 → GO接口设计与最佳实践专题

📝 发现内容有误?点击此处直接编辑

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库