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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。