Condition适用于需等待特定状态并由其他线程通知唤醒的多线程协作场景,如生产者-消费者、任务依赖协调和阶段性同步,支持原子性检查与等待、选择性唤醒,但不适用于单纯互斥或单次信号传递。

Python 的 condition(通常指 threading.Condition)适合解决多线程协作中需要等待特定状态、并由其他线程主动通知唤醒的问题。
需要线程间精确等待与唤醒的场景
当一个或多个线程必须暂停执行,直到某个共享条件成立(比如缓冲区非空、资源就绪、任务完成),而这个条件的变化由另一个线程控制时,Condition 比单纯轮询或简单锁更高效、更可靠。
- 生产者-消费者模型:消费者线程在队列为空时等待,生产者入队后通知;生产者在队列满时等待,消费者出队后通知
- 任务依赖协调:线程 A 需等线程 B 完成某步计算后再继续,B 完成后调用
notify() - 阶段性同步:多个工作线程都需等待“初始化完成”信号,主线程初始化完毕后用
notify_all()统一唤醒
需要原子性检查+等待的临界操作
Condition 将“检查条件 → 进入等待”封装为原子操作(通过 wait() 自动释放锁并挂起),避免竞态:不会出现检查完条件为假、刚释放锁就被其他线程修改状态、再进入等待却错过通知的情况。
- 普通
while not condition: time.sleep(0.1)易漏通知、耗 CPU、不及时 -
with cond: while not condition: cond.wait()确保检查和等待无缝衔接
需选择性唤醒或广播唤醒的协作模式
notify() 唤醒一个等待线程,notify_all() 唤醒全部。这比 Event(只能全通或全阻)更灵活,适用于不同粒度的唤醒需求。
立即学习“Python免费学习笔记(深入)”;
- 单个资源就绪 → 用
notify()让一个消费者处理,减少争抢 - 全局状态变更(如配置重载完成)→ 用
notify_all()让所有相关线程重新校验
不适合替代简单同步原语的场景
Condition 不是万能锁。它不适用于:
- 仅需互斥访问共享变量 → 用
threading.Lock更轻量 - 只需一次信号传递(如启动/停止标志)→
threading.Event更简洁 - 跨进程通信 →
Condition仅限线程内,需用multiprocessing.Condition
用错对象会导致代码复杂、易死锁或逻辑难维护。核心是:有明确的“等什么”和“谁来通知”,才用 Condition。










