条件变量用于线程同步,通过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 time
<p>condition = threading.Condition()
data_ready = False</p><p>def consumer():
print("消费者:等待数据准备...")
with condition:
while not data_ready:
condition.wait()
print("消费者:数据已就绪,开始处理")</p><p>def producer():
global data_ready
print("生产者:开始生成数据")
time.sleep(2)
with condition:
data_ready = True
print("生产者:数据准备完成,通知等待线程")
condition.notify()</p><h1>创建线程</h1><p>t1 = threading.Thread(target=consumer)
t2 = threading.Thread(target=producer)</p><p>t1.start()
t2.start()</p><p>t1.join()
t2.join()</p>为什么需要while循环检查条件?
尽管if看起来足够,但实际应使用while循环来判断条件是否成立。这是因为:
- 可能存在虚假唤醒(spurious wakeups),即线程没有收到notify也被唤醒
- 多个消费者竞争时,notify()只唤醒一个线程,其他被唤醒的线程需要重新检查条件
- 确保唤醒后条件依然成立,避免逻辑错误
Condition的应用场景
Condition适用于需要线程间协作的典型模式:
- 生产者-消费者模型:生产者生成数据后通知消费者消费
- 任务依赖控制:前序任务完成后再触发后续任务执行
- 资源池管理:如连接池中等待可用连接
例如实现一个带缓冲区的队列:
import threading
import queue
<p>class BlockingQueue:
def <strong>init</strong>(self, max_size=10):
self.queue = queue.Queue(max_size)
self.condition = threading.Condition()</p><pre class='brush:python;toolbar:false;'>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检查条件,避免死锁或逻辑错误。










