Python 条件变量
在Python中,条件变量(condition variable)是一种多线程编程中常用的同步机制,用于实现多个线程之间的协调和通信。条件变量通常与锁(Lock)一起使用,用于在某些条件被满足时让线程进入等待状态,直到另一个线程通知它继续执行。
什么是条件变量
条件变量是Python标准库中threading
模块提供的一种同步机制。它基于一个锁和一个变量组成,用于在线程间建立一种协调机制。条件变量通常用于多线程之间的协调和通信,可以实现线程的等待和唤醒。
在条件变量中,有两个重要的概念:
- 锁(Lock):用于保护条件变量的访问和修改,避免多个线程同时修改条件变量造成数据竞争。
- 变量(Condition):用于存储并发数据共享状态的变量。
条件变量通常使用wait()、notify()和notify_all()等方法来实现线程之间的等待和唤醒操作。
使用条件变量
下面是一个使用条件变量的示例代码,其中有两个线程,一个生产者线程往队列中添加数据,一个消费者线程从队列中取出数据。
import threading
import time
# 定义一个最大容量为5的队列
queue = []
MAX_SIZE = 5
lock = threading.Lock()
condition = threading.Condition(lock)
# 生产者线程
def producer():
while True:
with condition:
while len(queue) >= MAX_SIZE:
print("队列已满,等待消费者消费...")
condition.wait()
element = time.time()
queue.append(element)
print("生产者生产了一个元素: %s" % element)
condition.notify()
time.sleep(1)
# 消费者线程
def consumer():
while True:
with condition:
while len(queue) == 0:
print("队列为空,等待生产者生产...")
condition.wait()
element = queue.pop(0)
print("消费者消费了一个元素: %s" % element)
condition.notify()
time.sleep(2)
# 启动生产者和消费者线程
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)
producer_thread.start()
consumer_thread.start()
在这段代码中,我们使用一个条件变量condition
来实现生产者线程和消费者线程之间的同步。其中,生产者线程通过condition.wait()
方法等待队列不满的条件,消费者线程通过condition.wait()
方法等待队列不为空的条件。当其中一个条件满足时,通过condition.notify()
方法通知另一个线程继续执行。
运行结果
当我们运行上述代码时,可以看到生产者线程和消费者线程之间的协作,生产者生产元素并将其放入队列中,消费者从队列中取出元素进行消费。
生产者生产了一个元素: 1631540634.6652
生产者生产了一个元素: 1631540635.668083
消费者消费了一个元素: 1631540634.6652
生产者生产了一个元素: 1631540636.671591
生产者生产了一个元素: 1631540637.6729548
消费者消费了一个元素: 1631540635.668083
生产者生产了一个元素: 1631540638.674893
生产者生产了一个元素: 1631540639.7266285
消费者消费了一个元素: 1631540636.671591
总结
条件变量是Python中多线程编程中常用的同步机制,用于实现线程之间的协调和通信。通过条件变量,我们可以很方便地实现线程之间的等待和唤醒操作,实现生产者消费者模型等多线程场景。在实际开发中,我们可以灵活运用条件变量来解决多线程并发访问共享资源的问题,确保线程之间的同步和数据一致性。