全部学科
Python全栈
python
NodeJS全栈
nodejs
📝 1 篇文章 20 道配套习题

并发编程基础专题

专题说明

Python并发编程是提升程序性能的重要手段。本专题从线程和进程的基本概念出发,深入讲解GIL机制的影响、threading和multiprocessing模块的使用、线程池和进程池的最佳实践、同步原语的正确使用,帮助学习者掌握Python并发编程的核心技能。

学习目标

  1. 理解并发与并行的区别及适用场景
  2. 掌握GIL对Python多线程的影响
  3. 熟练使用threading和multiprocessing模块
  4. 掌握线程池和进程池的使用方法
  5. 理解同步原语(锁、信号量、事件等)的使用

学习内容

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

并发与并行基础

  • 并发与并行的概念区别
  • CPU密集型与IO密集型任务
  • Python并发编程模型概览

线程与GIL

  • threading模块创建线程
  • GIL全局解释器锁的原理
  • GIL对多线程性能的影响
  • 多线程适用的场景

进程

  • multiprocessing模块创建进程
  • 进程间通信方式
  • 进程 vs 线程的选择
  • 多进程适用场景

线程池与进程池

  • concurrent.futures模块
  • ThreadPoolExecutor使用
  • ProcessPoolExecutor使用
  • 提交任务与获取结果

同步与互斥

  • Lock互斥锁
  • RLock可重入锁
  • Semaphore信号量
  • Event事件
  • Condition条件变量
  • Queue线程安全队列

学习建议

  1. 先理解并发基本概念,再动手实践
  2. 注意区分IO密集型和CPU密集型任务的并发策略
  3. 理解GIL的存在意义和对多线程的影响
  4. 同步原语要注意死锁问题,掌握避免死锁的方法

📝 配套习题(20 题)

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

queue.Queue是线程安全的队列,多个线程可以安全地同时进行put()和get()操作,无需额外加锁。

A

B

2

ProcessPoolExecutor与ThreadPoolExecutor用法相似,但使用进程而非线程,适合CPU密集型任务,可以真正并行执行。

A

B

3

multiprocessing模块用于创建和管理进程,每个进程有独立的Python解释器和内存空间,可以绕过GIL实现真正的并行执行。

A

B

4

GIL(Global Interpreter Lock)是Python解释器的机制,它确保同一时刻只有一个线程执行Python字节码,这限制了多线程在CPU密集型任务中的并行能力。

A

B

5

线程锁Lock用于防止多个线程同时访问共享资源,acquire()获取锁,release()释放锁,确保同一时刻只有一个线程可以执行被保护的代码段。

A

B

6

Python的threading模块提供了创建和管理线程的功能,使用Thread类可以创建新线程,调用start()方法启动线程。

A

B

7

ThreadPoolExecutor是concurrent.futures模块提供的线程池,可以高效管理多个线程,自动分配任务,比手动创建线程更高效。

A

B

单选题
8

关于RLock(可重入锁)和Lock的区别,以下说法正确的是:

A

RLock和Lock完全相同

B

RLock允许同一线程多次获取锁,Lock不允许

C

Lock性能更好,RLock性能更差

D

RLock只能在递归函数中使用

9

执行q.get()时,如果队列为空,会发生什么?

A

返回None

B

返回空字符串''

C

阻塞等待直到有元素

D

抛出Empty异常

10

ThreadPoolExecutor的submit()和map()方法的区别是:

A

submit返回Future对象,map直接返回结果列表

B

submit只能提交单个任务,map提交多个

C

submit阻塞执行,map异步执行

D

A和B都正确

11

关于Thread的start()和run()方法,以下说法正确的是:

A

start()和run()效果相同,都可以启动线程

B

start()启动新线程执行run()方法,run()在当前线程执行

C

run()启动新线程,start()在当前线程执行

D

两者都必须调用才能启动线程

12

GIL对以下哪种任务的影响最大?

A

网络请求(下载文件)

B

文件读写操作

C

大量数学计算(CPU密集型)

D

用户界面响应

13

multiprocessing中,哪种方式可以实现进程间的数据共享?

A

直接访问全局变量

B

multiprocessing.Queue

C

普通的list和dict

D

以上都可以

14

以下代码执行后,可能的输出顺序是?

Python
import threading

def task():
    print('线程')

t = threading.Thread(target=task)
t.start()
print('主线程')
A

线程 → 主线程(固定顺序)

B

主线程 → 线程(固定顺序)

C

线程 → 主线程 或 主线程 → 线程(顺序不确定)

D

只输出主线程

填空题
15

Queue是____________的队列,内部自动处理____________。put()放入元素,队列满时____________。get()取出元素,队列空时阻塞。get_nowait()不阻塞取出,空时抛Empty异常。maxsize参数限制队列最大容量。

16

Lock用于互斥访问,____________()获取锁,____________()释放锁,推荐使用____________语句自动管理。RLock是可重入锁,同一线程可多次获取。Semaphore是信号量,控制同时访问资源的线程数量上限。

17

ThreadPoolExecutor创建线程池,____________指定最大线程数。____________()提交单个任务,返回____________对象,调用result()获取结果。map()批量提交任务,直接返回结果迭代器。使用with语句自动关闭线程池。

18

GIL确保同一时刻只有____________线程执行Python字节码。GIL对____________型任务影响最大,对____________型任务影响较小(I/O时会释放GIL)。规避GIL的方法:使用multiprocessing(多进程)、使用C扩展、使用asyncio异步编程。

19

创建线程使用threading.____________类,传入____________参数指定执行函数,使用____________传递参数。调用start()方法启动线程,调用join()方法等待线程结束。使用current_thread()获取当前线程对象。

20

multiprocessing.Process创建进程,使用____________()启动,____________()等待。进程间通信使用____________(队列)、Pipe(管道)、Manager(共享对象)。进程有独立内存空间,可以绕过GIL实现真正并行。

参考答案
1.正确 2.正确 3.正确 4.正确 5.正确 6.正确 7.正确 8.B 9.C 10.D 11.B 12.C 13.B 14.C 15.线程安全;同步;阻塞 16.acquire;release;with 17.max_workers;submit;Future 18.一个;CPU密集;I/O密集 19.Thread;target;args 20.start;join;Queue
想在手机上练习这套专题?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一个专题 并发与异步高级专题
下一个专题 → 异常处理专题
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码