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