Python线程协作threading.Condition实现过程解析
领会下面这个示例吧,其实跟java中wait/nofity是一样一样的道理
importthreading
#条件变量,用于复杂的线程间同步锁
"""
需求:
男:小姐姐,你好呀!
女:哼,想泡老娘不成?
男:对呀,想泡你
女:滚蛋,门都没有!
男:切,长这么丑,还这么吊...
女:关你鸟事!
"""
classBoy(threading.Thread):
def__init__(self,name,condition):
super().__init__(name=name)
self.condition=condition
defrun(self):
withself.condition:
print("{}:小姐姐,你好呀!".format(self.name))
self.condition.wait()
self.condition.notify()
print("{}:对呀,想泡你".format(self.name))
self.condition.wait()
self.condition.notify()
print("{}:切,长这么丑,还这么吊...".format(self.name))
self.condition.wait()
self.condition.notify()
classGirl(threading.Thread):
def__init__(self,name,condition):
super().__init__(name=name)
self.condition=condition
defrun(self):
withself.condition:
print("{}:哼,想泡老娘不成?".format(self.name))
self.condition.notify()
self.condition.wait()
print("{}:滚蛋,门都没有!".format(self.name))
self.condition.notify()
self.condition.wait()
print("{}:关你鸟事!".format(self.name))
self.condition.notify()
self.condition.wait()
if__name__=='__main__':
condition=threading.Condition()
boy_thread=Boy('男',condition)
girl_thread=Girl('女',condition)
boy_thread.start()
girl_thread.start()
Condition的底层实现了__enter__和__exit__协议.所以可以使用with上下文管理器
由Condition的__init__方法可知,它的底层也是维护了一个RLock锁
def__enter__(self): returnself._lock.__enter__()
def__exit__(self,*args): returnself._lock.__exit__(*args)
def__exit__(self,t,v,tb): self.release()
defrelease(self):
"""Releasealock,decrementingtherecursionlevel.
Ifafterthedecrementitiszero,resetthelocktounlocked(notowned
byanythread),andifanyotherthreadsareblockedwaitingforthe
locktobecomeunlocked,allowexactlyoneofthemtoproceed.Ifafter
thedecrementtherecursionlevelisstillnonzero,thelockremains
lockedandownedbythecallingthread.
Onlycallthismethodwhenthecallingthreadownsthelock.A
RuntimeErrorisraisedifthismethodiscalledwhenthelockis
unlocked.
Thereisnoreturnvalue.
"""
ifself._owner!=get_ident():
raiseRuntimeError("cannotreleaseun-acquiredlock")
self._count=count=self._count-1
ifnotcount:
self._owner=None
self._block.release()
至于wait/notify是如何操作的,还是有点懵.....
wait()方法源码中这样三行代码
waiter=_allocate_lock()#从底层获取了一把锁,并非Lock锁
waiter.acquire()
self._waiters.append(waiter)#然后将这个锁加入到_waiters(deque)中
saved_state=self._release_save()#这是释放__enter__时的那把锁???
notify()方法源码
all_waiters=self._waiters waiters_to_notify=_deque(_islice(all_waiters,n))#从_waiters中取出n个 ifnotwaiters_to_notify:#如果是None,结束 return forwaiterinwaiters_to_notify:#循环release waiter.release() try: all_waiters.remove(waiter)#从_waiters中移除 exceptValueError: pass
大体意思:wait先从底层创建锁,acquire,放到一个deque中,然后释放掉with锁,notify时,从deque取拿出锁,release
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。