
1、acquire调用Condition关联的方法。
Lock的acquire()或release()。
2、wait传入timeout参数。
指定该线程最多等待多少秒。
导致当前线程进入Condition的等待池等待通知并释放锁,直到其他线程调用该Condition的notify()或者notify_all()方法来唤醒该线程。在调用该wait()方法时可以
3、notify唤醒Condition的单个线程并通知。
收到通知的线程会自动调用accquire()方法尝试加锁。如果所有线程都在该Condition等待池中等待,则会选择唤醒其中一个线程,选择是任意性的。
4、notify_all唤醒所有线程并通知。
实例
importthreading
classAccount:
#定义构造函数
def__init__(self,account_no,balance):
self.account_no=account_no
self._balance=balance
self.condition=threading.Condition()
#定义代表是否已经存钱的标识
self.__deposit_flag=False
#取钱
defdraw(self,draw_amount):
#加锁
self.condition.acquire()
try:
#还没存钱
ifnotself.__deposit_flag:
self.condition.wait()
else:
ifself._balance>=draw_amount:
self._balance=self._balance-draw_amount
print(threading.current_thread().getName()+"取钱成功,账户余额是:"+str(self._balance)+"\n")
else:
print(threading.current_thread().getName()+"取钱失败\n")
#将标识账户已有存款的标识改成False
self.__deposit_flag=False
#唤醒其他等待现车线程
self.condition.notify_all()
finally:
#释放锁
self.condition.release()
#存钱
defdeposit(self,deposit_amount):
#加锁
self.condition.acquire()
try:
#如果已经存款了,则等待取款
ifself.__deposit_flag:
self.condition.wait()
else:
self._balance=self._balance+deposit_amount
print(threading.current_thread().getName()+"存款成功,存款金额是:"+str(deposit_amount)+"\n")
#将存款标识改成已存款
self.__deposit_flag=True
#唤醒其他线程
self.condition.notify_all()
finally:
#释放锁
self.condition.release()
defdraw_many(account,draw_amount,max):
foriinrange(max):
account.draw(draw_amount)
defdeposit_many(account,deposit_amount,max):
foriinrange(max):
account.deposit(deposit_amount)
#创建一个账户
account=Account("账户一",0)
#创建并启动取钱线程
draw_1=threading.Thread(name='取钱者一',target=draw_many,args=(account,200,50))
draw_1.start()
draw_2=threading.Thread(name='取钱者二',target=draw_many,args=(account,200,50))
draw_2.start()
#创建并启动存钱线程
deposit_1=threading.Thread(name='存钱者一',target=deposit_many,args=(account,200,50))
deposit_1.start()
deposit_2=threading.Thread(name='存钱者二',target=deposit_many,args=(account,200,50))
deposit_2.start()
draw_1.join()
draw_2.join()
deposit_1.join()
deposit_2.join()
以上就是python线程通信Condition提供的方法,希望对大家有所帮助。更多Python学习指路:Python基础教程