发布时间:2022-05-13 文章分类:Python 知识 投稿人:王小丽 字号: 默认 | | 超大 打印

python线程通信Condition提供的方法

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基础教程