题目重点:区分并发和并行,按IO/CPU任务选择机制,并说明GIL不能保护多步业务不变量。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 以一般操作系统进程/线程为基础,Python实现和是否启用GIL需现场确认。
解题路线
- 进程通常拥有独立地址空间与资源隔离,线程在同进程共享地址空间但有独立执行栈;共享降低数据交换成本,同时提高竞态和故障波及风险。
- 并发是任务进展交错,并行是同刻多个执行。线程数多不自动更快,调度、同步和共享缓存争用可能反而增加延迟。
- IO等待任务可用线程或async提高重叠;CPU密集纯Python在通常启用GIL的CPython里不能凭多个线程并行执行Python字节码,多进程或释放GIL的原生计算可不同。
- Python存在可选free-threaded构建,因此“Python永远只能一个线程”不是普遍定律。即便没有GIL也需锁维护共享数据,多步检查/更新不能靠解释器内部容器保护当业务事务。
- 多进程需要序列化/IPC和独立生命周期,启动与复制/共享内存开销应计入;传很大的数据给worker可能抵消计算收益。线程也要限制数量、取消与资源清理。
- 测试竞争、死锁、异常、超时和关闭顺序,控制输入速率观察吞吐与尾延迟;用确定同步点复现竞态,别仅靠sleep碰运气。
手动走一遍
下载多份小文件常是IO等待,线程可重叠;大规模纯Python计算在GIL构建中应评估进程。共享余额“先读再减再写”即使dict单次操作安全,整体仍需要同步。
规模与取舍
不以线程数推导线性提速;串行比例、IPC与同步限制扩展。内存为各进程状态/栈及队列总量,CPU和连接数需有预算。
易错点与追问
容易失分的边界
- 并发等同并行。
- GIL保护所有业务复合操作。
- 多进程IPC和数据复制免费。
继续深挖
- async与线程怎么选?
- 进程池大对象怎样传?
- 如何设计无死锁锁顺序?
技术参考
- Python threading:技术语义参考,具体题目按本文约定。
