说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
threading.Condition 是一个高级的线程同步工具,它结合了锁(Lock或RLock)和一个条件变量。条件对象用于线程之间的通信,允许一个或多个线程等待某个条件的发生,同时让另一个线程通知这些等待线程条件已满足。
Python threading 模块中的 Condition 对象是一种同步原语,用于协调多个线程之间的复杂同步场景。它允许线程等待某个条件成立,并在条件满足时通知其他线程。Condition 对象内部维护一个锁(默认是 RLock)和一个等待队列。线程可以在等待某个条件时释放锁并进入等待状态,当条件满足时,其他线程可以通知等待的线程重新获取锁并继续执行。
Condition 对象结合了锁(通常是 RLock)和一个等待池。线程可以通过 wait 方法在条件不满足时进入等待池并释放锁,其他线程可以通过 notify 或 notify_all 方法在条件满足时通知等待池中的一个或所有线程重新获取锁并继续执行。
构造方法 condition = threading.Condition(lock=None)
如果没有提供锁,会自动创建一个 RLock。
常用方法:
acquire(*args)
: 获取底层锁。release()
: 释放底层锁。wait(timeout=None)
: 释放锁,进入等待池等待被通知,可设置超时。wait_for(predicate, timeout=None)
: 等待直到指定的条件为真,可设置超时。notify(n=1)
: 通知等待池中的一个线程。notify_all()
: 通知等待池中的所有线程。使用场景:
以下是一个简单的示例:
import threading
import time
# 创建一个条件对象
condition = threading.Condition()
def wait_for_condition():
with condition:
print("等待条件满足...")
condition.wait() # 等待条件满足
print("条件已满足,继续执行")
def set_condition():
time.sleep(2) # 模拟一些操作
with condition:
print("设置条件...")
condition.notify() # 通知条件已满足
thread1 = threading.Thread(target=wait_for_condition)
thread2 = threading.Thread(target=set_condition)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
这个案例展示了一个生产者-消费者模型,其中生产者线程和消费者线程通过条件对象进行同步,确保生产和消费过程的协调。
import threading
from queue import Queue
buffer = Queue(maxsize=5)
condition = threading.Condition()
def producer():
for i in range(10):
with condition:
while buffer.full():
condition.wait()
buffer.put(i)
print(f"生产者生产: {i}")
condition.notify_all() # 通知消费者
def consumer():
for _ in range(10):
with condition:
while buffer.empty():
condition.wait()
item = buffer.get()
print(f"消费者消费: {item}")
condition.notify_all() # 通知生产者
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)
producer_thread.start()
consumer_thread.start()
producer_thread.join()
consumer_thread.join()
更新时间:June 30, 2024, 5:19 p.m. 标签:python threading 线程 条件对象