SDET / SWE · Technical Fundamentals

TikTok 线程与进程:共享内存、隔离与 Python 并行条件

区分并发和并行,按IO/CPU任务选择机制,并说明GIL不能保护多步业务不变量。

题目重点:区分并发和并行,按IO/CPU任务选择机制,并说明GIL不能保护多步业务不变量。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 以一般操作系统进程/线程为基础,Python实现和是否启用GIL需现场确认。

解题路线

  1. 进程通常拥有独立地址空间与资源隔离,线程在同进程共享地址空间但有独立执行栈;共享降低数据交换成本,同时提高竞态和故障波及风险。
  2. 并发是任务进展交错,并行是同刻多个执行。线程数多不自动更快,调度、同步和共享缓存争用可能反而增加延迟。
  3. IO等待任务可用线程或async提高重叠;CPU密集纯Python在通常启用GIL的CPython里不能凭多个线程并行执行Python字节码,多进程或释放GIL的原生计算可不同。
  4. Python存在可选free-threaded构建,因此“Python永远只能一个线程”不是普遍定律。即便没有GIL也需锁维护共享数据,多步检查/更新不能靠解释器内部容器保护当业务事务。
  5. 多进程需要序列化/IPC和独立生命周期,启动与复制/共享内存开销应计入;传很大的数据给worker可能抵消计算收益。线程也要限制数量、取消与资源清理。
  6. 测试竞争、死锁、异常、超时和关闭顺序,控制输入速率观察吞吐与尾延迟;用确定同步点复现竞态,别仅靠sleep碰运气。

手动走一遍

下载多份小文件常是IO等待,线程可重叠;大规模纯Python计算在GIL构建中应评估进程。共享余额“先读再减再写”即使dict单次操作安全,整体仍需要同步。

规模与取舍

不以线程数推导线性提速;串行比例、IPC与同步限制扩展。内存为各进程状态/栈及队列总量,CPU和连接数需有预算。

易错点与追问

容易失分的边界

  • 并发等同并行。
  • GIL保护所有业务复合操作。
  • 多进程IPC和数据复制免费。

继续深挖

  • async与线程怎么选?
  • 进程池大对象怎样传?
  • 如何设计无死锁锁顺序?

技术参考

✓已复制微信号!