Condition, 实现在某个事件触发后才处理数据,在多个Contidion中共享一个锁。
wait和release的区别:
release和wait都有释放锁的作用,不同在于wait后,该子线程就在那里挂起等待,要继续执行,就需要接收到notify或者notifyAll来唤醒线程,而release该线程还能继续执行。
wait会释放锁但是会挂起线程,不会继续向下运行。而release释放锁后有可能该线程继续向下运行。
- acquire([timeout])/release(): 调用关联的锁的相应方法。
- wait([timeout]): 调用这个方法将使线程进入Condition的等待池等待通知,并释放锁。使用前线程必须已获得锁定,否则将抛出异常。
- notify(): 调用这个方法将从等待池挑选一个线程并通知,收到通知的线程将自动调用
- acquire()尝试获得锁定(进入锁定池);其他线程仍然在等待池中。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常。
- notifyAll():调用这个方法将通知等待池中所有的线程,这些线程都将进入锁定池尝试获得锁定。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常。
import threading
class Xiansen(threading.Thread):
def __init__(self, cond):
super().__init__(name='先森')
self.cond = cond
def run(self):
with self.cond:
#调用with Condition之后才能调用wait和notify
print(f"{self.name}: 小宝贝")
self.cond.notify()
self.cond.wait()
print(f"{self.name}: 喜欢你喜欢你喜欢你")
self.cond.notify()
self.cond.wait()
class XiaoXianNv(threading.Thread):
def __init__(self, cond):
super().__init__(name='小仙女')
self.cond = cond
def run(self):
with self.cond:
self.cond.wait()
print(f"{self.name}: 嗯哼?")
self.cond.notify()
self.cond.wait()
print(f"{self.name}: 对不起,你是个坏人")
self.cond.notify()
if __name__ == '__main__':
cond = threading.Condition()
kailin = Xiansen(cond)
xiao = XiaoXianNv(cond)
xiao.start() #后应答的先start
kailin.start()
执行结果: