Python线程同步主要靠Lock和Condition实现:Lock用于简单互斥,需acquire/release配对或with语句;Condition封装Lock,配合while循环使用wait/notify实现线程协作,须避免虚假唤醒与死锁。

Python中线程同步主要靠锁(Lock)和条件变量(Condition)实现,它们解决的是多个线程访问共享资源时的数据竞争问题。锁适合简单互斥场景,条件变量则用于更复杂的线程协作,比如“等某个条件成立再继续”。用错或漏用会导致死锁、假唤醒或逻辑错误。
锁(Lock):最基础的互斥工具
Lock保证同一时刻只有一个线程能执行某段代码(临界区)。它只有两种状态:locked 和 unlocked。调用 acquire() 获取锁,release() 释放锁。必须成对使用,否则可能造成死锁。
- 推荐用
with lock:语句自动管理加锁/释放,避免忘记release() - 不要在未持有锁时调用
release(),会抛出RuntimeError - 可重入锁(
RLock)允许同一线程多次acquire(),适合递归调用场景
条件变量(Condition):带等待与通知机制的锁
Condition 内部封装了一个 Lock(默认是 RLock),提供 wait()、notify() 和 notify_all() 方法。它不直接保护数据,而是配合显式判断的条件使用——线程在条件不满足时挂起,等其他线程修改状态并通知后才继续检查。
- 必须在
with condition:块内调用wait(),否则会报错 -
wait()会自动释放锁并阻塞;被唤醒后重新获取锁才返回,所以醒来后要再次检查条件是否真正成立(用while而非if) -
notify()唤醒一个等待线程,notify_all()唤醒全部,但不保证唤醒顺序
典型误用与规避建议
常见陷阱包括:只用 if 判断条件后 wait()(忽略虚假唤醒)、在没加锁的情况下读写共享变量、多个 Condition 共享同一把锁却没统一协调逻辑。
立即学习“Python免费学习笔记(深入)”;
- 所有对共享状态的读写操作,都应在锁保护下进行
- 使用 Condition 时,把“条件判断 + wait”写在
while循环里,例如:while not data_ready: cond.wait() - 避免嵌套锁或跨函数传递锁对象,容易引发死锁;优先用高阶同步原语(如
queue.Queue)替代手动同步
锁和条件变量不是万能解药,过度同步会影响并发性能。实际开发中,优先考虑无锁结构(如不可变对象)、线程局部存储(threading.local)或内置线程安全类型(如 queue.Queue),再按需引入底层同步机制。










