全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页

GO并发编程专题测试

19 题 45 分钟 难度:

考察知识点

1. Goroutine基础

  • 创建方式:go关键字启动goroutine
  • 特性特点:轻量级、初始栈2KB、运行时调度
  • 与主goroutine关系:并发执行、非操作系统线程
  • 创建成本:极低,可轻松创建数万个goroutine

2. Channel通信机制

  • Channel基础:创建、发送、接收、关闭
  • 缓冲Channel:带缓冲vs无缓冲、容量设置
  • 单向Channel:只读、只写、类型安全
  • Channel关闭:close操作、检测关闭、遍历已关闭channel

3. Select多路复用

  • Select语法:多channel同时监听
  • 随机选择:多个case可执行时随机选择
  • Default分支:非阻塞操作、立即返回
  • 阻塞行为:无可用case时阻塞等待
  • for+select组合:持续监听、实现退出机制

4. 并发同步原语

  • Mutex/RWMutex:互斥锁、读写锁、锁竞争
  • sync.WaitGroup:等待一组goroutine完成
  • sync.Once:单次执行、单例模式
  • sync.Cond:条件变量、等待/通知
  • sync.Pool:对象池、减少分配
  • atomic包:原子操作、CAS

5. 并发设计模式

  • Worker Pool:固定worker处理任务队列
  • Pipeline:阶段式数据处理、链式传递
  • Fan-out/Fan-in:多worker并行+结果合并
  • Producer-Consumer:生产者消费者模式
  • 优雅退出:context取消、done channel

6. 竞态检测与调试

-竞态检测:-race编译参数、检测数据竞争

  • pprof goroutine:查看goroutine状态
  • runtime调试:GODEBUG参数、栈dump
  • 死锁预防:避免循环等待、设置超时
  • Goroutine泄露:检测方法、预防策略

7. Context上下文

  • Context作用:取消传播、超时控制、值传递
  • context包函数:WithCancel、WithTimeout、WithValue
  • 使用规范:传递参数而非存储、函数参数传递

8. 并发安全设计

  • 数据竞争:共享变量访问、同步保护
  • 无锁设计:atomic操作、CAS替代锁
  • 并发map:sync.Map使用场景
  • 不可变数据:只读、避免共享
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.Once可以确保某个函数在程序运行期间只执行一次,即使多次调用Do方法。

A

B

7
多选题

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

A

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

B

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

C

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

D

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

E

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

8
多选题

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

A

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

B

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

C

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

D

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

E

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

9
判断题

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

A

B

10
判断题

使用for range遍历channel时,channel关闭后循环会自动结束。

A

B

11
多选题

以下哪些是Go中常见的并发设计模式?

A

Worker Pool(工作池)

B

Pipeline(管道)

C

Fan-out/Fan-in(扇出扇入)

D

Producer-Consumer(生产者消费者)

E

Promise/Future(承诺/未来)

12
多选题

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

A

子context取消不会影响父context

B

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

C

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

D

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

E

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

13
单选题

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

A

-gcflags='-race'

B

-race

C

-detect-race

D

-debug race

14
判断题

当goroutine被channel操作阻塞时,可以通过runtime调试信息查看阻塞原因。

A

B

15
填空题

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

16
单选题

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

A

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

B

创建多个goroutine

C

替代Mutex进行同步

D

实现管道过滤

17
多选题

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

A

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

B

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

C

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

D

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

E

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

18
填空题

解决数据竞争的主要方法包括:使用 ______ 互斥锁保护共享变量、使用 _______ 读写锁处理读多写少场景、使用 ______ 包进行原子操作、使用 _______ 进行goroutine间通信。Go的竞态检测器通过 ______ 标志启用。

19
填空题

可以用channel实现简单的互斥锁:创建容量为 ______ 的缓冲channel作为令牌,______ 时从channel接收(令牌取出),______ 时向channel发送(令牌归还)。这种方式称为 ________,比sync.Mutex更灵活但性能较低。

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

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

想参加完整模拟考试?
小程序提供计时考试、自动评分和详细解析

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

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