条件变量用于线程同步,通过wait()、notify()实现线程间通信;需用while循环检查条件以防虚假唤醒;适用于生产者-消费者等协作场景。

在Python多线程编程中,Condition(条件变量)是一种同步原语,用于协调多个线程之间的执行顺序。它允许线程在某个条件不满足时暂停执行,直到其他线程发出信号通知条件已满足。
Condition的基本用法
Condition通常与锁(Lock)结合使用,内部自带一个锁,也可以传入外部锁。它的核心方法包括wait()、notify()和notify_all()。
常见操作流程:
- wait():线程调用该方法后会释放锁并进入阻塞状态,等待被唤醒
- notify():唤醒一个正在等待的线程(如果有多个)
- notify_all():唤醒所有等待的线程
使用with语句可以自动管理锁的获取和释放:
立即学习“Python免费学习笔记(深入)”;
经过数月的努力,纵横B2B V3.0正式发布。感谢所有用户的大力支持和耐心等待,升级过程中提出了众多有价值的功能建议,向他们致敬。本次升级直接跨越到3.0版本,意味着将会带来很多新的变化。首先最大的变化是用户中心,我们借鉴了大量SNS社区、WEB2.0网站的概念,增强了交互性和可操作性;其次彻底抛弃了关键词竞价模式,改为直接购买关键词,为网站带来直接收益创造了条件;对系统性能进行了大量改进,使得系
import threading import timecondition = threading.Condition() data_ready = False
def consumer(): print("消费者:等待数据准备...") with condition: while not data_ready: condition.wait() print("消费者:数据已就绪,开始处理")
def producer(): global data_ready print("生产者:开始生成数据") time.sleep(2) with condition: data_ready = True print("生产者:数据准备完成,通知等待线程") condition.notify()
创建线程
t1 = threading.Thread(target=consumer) t2 = threading.Thread(target=producer)
t1.start() t2.start()
t1.join() t2.join()
为什么需要while循环检查条件?
尽管if看起来足够,但实际应使用while循环来判断条件是否成立。这是因为:
- 可能存在虚假唤醒(spurious wakeups),即线程没有收到notify也被唤醒
- 多个消费者竞争时,notify()只唤醒一个线程,其他被唤醒的线程需要重新检查条件
- 确保唤醒后条件依然成立,避免逻辑错误
Condition的应用场景
Condition适用于需要线程间协作的典型模式:
- 生产者-消费者模型:生产者生成数据后通知消费者消费
- 任务依赖控制:前序任务完成后再触发后续任务执行
- 资源池管理:如连接池中等待可用连接
例如实现一个带缓冲区的队列:
import threading import queueclass BlockingQueue: def init(self, max_size=10): self.queue = queue.Queue(max_size) self.condition = threading.Condition()
def put(self, item): with self.condition: while self.queue.qsize() >= self.queue.maxsize: self.condition.wait() self.queue.put(item) self.condition.notify_all() def get(self): with self.condition: while self.queue.empty(): self.condition.wait() item = self.queue.get() self.condition.notify_all() return item
基本上就这些。Condition比简单使用Lock更灵活,能精确控制线程何时继续执行,但要注意正确使用while检查条件,避免死锁或逻辑错误。










