python condition条件变量

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

在Python多线程编程中,Condition(条件变量)是一种同步原语,用于协调多个线程之间的执行顺序。它允许线程在某个条件不满足时暂停执行,直到其他线程发出信号通知条件已满足。

Condition的基本用法

Condition通常与锁(Lock)结合使用,内部自带一个锁,也可以传入外部锁。它的核心方法包括wait()、notify()和notify_all()。

常见操作流程:

  • wait():线程调用该方法后会释放锁并进入阻塞状态,等待被唤醒
  • notify():唤醒一个正在等待的线程(如果有多个)
  • notify_all():唤醒所有等待的线程

使用with语句可以自动管理锁的获取和释放:

import threading
import time

condition = 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 queue

class 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检查条件,避免死锁或逻辑错误。