标准答案

  1. Lock 保护共享可变状态,临界区应短且锁顺序稳定。
  2. RLock 只解决同一线程嵌套获取,不会消除跨线程竞争。
  3. Semaphore 适合限制数据库、HTTP 或文件等资源的同时使用量。
  4. Condition 等待条件时要在循环中重新判断,并处理超时和关闭。

题目解析

GIL 不是业务锁,也不能保护多个 Python 语句组成的读改写。Lock 保护临界区,RLock 解决同一线程嵌套获取,Semaphore 限制并发许可,Condition 等待共享状态变化。

Condition 被唤醒后必须在循环中重新判断谓词,因为状态可能已被其他线程改变或发生虚假唤醒。锁顺序和临界区长度也要明确。

Semaphore acquire 后要在 finally release,异常、取消和超时都不能泄漏许可。同步原语只保护进程内状态,跨进程需要 IPC 或外部存储。

常见误区

  • 误区:把 GIL 当作业务锁。改正:对复合状态使用 Lock/事务/消息同步,GIL 不提供业务不变式。
  • 误区:Condition 被唤醒后不重新检查状态。改正:在锁内循环检查条件并处理超时。
  • 误区:Semaphore 异常路径不释放。改正:acquire 成功后用 try/finally release。

作者信息