当前位置:首页>python>每日Python面试题 · 第7期

每日Python面试题 · 第7期

  • 2026-09-10 02:00:56
每日Python面试题 · 第7期

1️⃣ 什么是 multiprocessing?解决什么问题?

标准答案:

multiprocessing 是 Python 用于创建多个进程并行执行任务的模块。

它主要解决 CPU 密集型任务无法真正并行的问题,因为 Python 存在 GIL(全局解释器锁),导致多线程无法利用多核 CPU。

👉 multiprocessing 通过“多进程 + 独立内存空间”,实现真正的并行计算。


2️⃣ multiprocessing 和 threading 有什么区别?

标准答案:

对比项
threading
multiprocessing
单位
线程
进程
内存
共享
独立
是否受 GIL 影响
受影响
不受影响
性能场景
IO 密集型
CPU 密集型
开销
小
大

👉 一句话总结:

  • threading = 并发(假装一起干)
  • multiprocessing = 并行(真的一起干)

3️⃣ GIL 是什么?

标准答案:

GIL(Global Interpreter Lock)是 Python 解释器中的全局锁。

它规定:👉 同一时刻只能有一个线程执行 Python 字节码。

影响:

  • 多线程无法利用多核 CPU
  • CPU 密集型任务性能差

👉 所以需要 multiprocessing 绕过 GIL。


⚙️ 二、Process 核心类

4️⃣ Process 是什么?怎么用?

标准答案:

Process 是 multiprocessing 中用于创建进程的类。

使用步骤:

  1. 创建 Process 对象
  2. start() 启动进程
  3. join() 等待结束
p=Process(target=func, args=(1,))p.start()p.join()

5️⃣ join() 是干嘛的?

标准答案:

join() 的作用是:👉 阻塞主进程,等待子进程执行完成。

如果不调用 join:

  • 主进程可能提前结束
  • 子进程被强制终止

6️⃣ daemon 进程是什么?

标准答案:

daemon 进程是守护进程:

特点:

  • 随主进程退出而退出
  • 不会阻塞主进程退出
  • 通常用于后台任务
p.daemon =True

👉 一句话:主进程是老板,daemon 是助理,老板走助理就下班。


🧩 三、Pool 进程池(重点🔥)

7️⃣ Pool 是什么?为什么要用?

标准答案:

Pool 是进程池,用来管理多个工作进程。

作用:

  • 避免频繁创建/销毁进程
  • 提高性能
  • 控制最大并发数

👉 本质:线程池的“进程版”


8️⃣ apply / apply_async / map 区别?

标准答案(面试必背)

方法
同步/异步
用途
apply
同步
单任务
apply_async
异步
单任务
map
同步
批量任务
map_async
异步
批量任务

👉 一句话记忆:

  • apply = 一个一个来
  • map = 批量发任务
  • async = 不等结果

9️⃣ map 和 starmap 区别?

标准答案:

  • map:只能传单参数
  • starmap:支持多个参数(自动拆 tuple)
starmap(func, [(1,2), (3,4)])

👉 本质:是否支持“解包参数”


🔟 为什么 Pool 要 close + join?

标准答案:

  • close():停止接收新任务
  • join():等待所有任务完成

👉 必须配套使用,否则:

  • 资源泄漏
  • 子进程未结束
  • 程序卡死或异常退出

👉 Python 推荐:

withPool() aspool:

自动帮你 close + join


💬 四、进程通信 IPC

1️⃣1️⃣ 进程之间如何通信?

标准答案:

进程之间内存独立,不能直接共享变量。

通信方式:

  • Queue(最常用)
  • Pipe(双向)
  • Manager(共享对象)
  • shared_memory(底层共享内存)

1️⃣2️⃣ Queue 和 Pipe 区别?

标准答案:

  • Queue:多生产者多消费者,线程/进程安全
  • Pipe:两端通信,效率高但限制多

👉 面试一句话:Queue = 工厂流水线Pipe = 两人对讲机


1️⃣3️⃣ 为什么进程不能直接共享变量?

标准答案:

因为每个进程有独立内存空间(OS级隔离)。

👉 所以变量是“复制的”,不是“共享的”。


🧠 五、共享内存 & 锁

1️⃣4️⃣ Value / Array 是什么?

标准答案:

multiprocessing.Value / Array 是共享内存机制:

  • Value:单个变量
  • Array:数组

👉 用于多个进程共享简单数据


1️⃣5️⃣ 为什么共享内存还要 Lock?

标准答案:

因为操作不是原子性的,比如:

counter+=1

实际上是:

  1. 读
  2. 修改
  3. 写

👉 多进程会导致 race condition


1️⃣6️⃣ Lock 和 RLock 区别?

标准答案:

  • Lock:不可重入(同一个进程重复获取会死锁)
  • RLock:可重入(同一个进程可以多次获取)

1️⃣7️⃣ 什么是死锁?

标准答案:

死锁是多个进程互相等待资源释放,导致全部阻塞。

原因:

  • 锁顺序不一致
  • 嵌套锁

👉 解决:

  • 统一加锁顺序
  • 使用 RLock
  • 减少锁粒度

1️⃣8️⃣ Semaphore 是什么?

标准答案:

Semaphore(信号量)用于控制并发数量。

👉 本质:限流器

例如:

Semaphore(2)

表示最多允许2个进程同时执行。


🚀 六、底层原理(加分题)

1️⃣9️⃣ Windows 和 Linux multiprocessing 区别?

标准答案:

系统
启动方式
Linux
fork
Windows
spawn

2️⃣0️⃣ fork vs spawn?

标准答案:

  • fork:复制父进程(快)
  • spawn:重新启动 Python(安全但慢)

2️⃣1️⃣ 为什么必须写 main?

标准答案:

因为 Windows 使用 spawn,会重新导入模块。

如果不加:👉 会无限递归创建子进程(“进程生进程”)


2️⃣2️⃣ multiprocessing 为什么适合 CPU 密集型?

标准答案:

因为:

  • 不受 GIL 限制
  • 可以真正多核并行执行

👉 适合:计算、图像处理、数据分析

最新文章

随机文章