10.5线程同步--conditon 使用以及源码分析
Posted _simpleSmile
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10.5线程同步--conditon 使用以及源码分析相关的知识,希望对你有一定的参考价值。
1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 4 # 条件变量,用于复杂的线程间同步 5 # 通过condition完成协同读诗 6 from threading import Lock 7 from threading import Condition 8 import threading 9 10 11 class XiaoAi(threading.Thread): 12 def __init__(self, cond): 13 super().__init__(name=‘小爱‘) 14 self.cond = cond 15 16 def run(self): 17 with self.cond: 18 # 等待 19 self.cond.wait() 20 print(‘{} : 在‘.format(self.name)) 21 # 通知 22 self.cond.notify() 23 # 等待 24 self.cond.wait() 25 print(‘{} : 好啊‘.format(self.name)) 26 # 通知 27 self.cond.notify() 28 29 30 class TianMao(threading.Thread): 31 def __init__(self, cond): 32 super().__init__(name=‘天猫‘) 33 self.cond = cond 34 35 def run(self): 36 # 建议使用with语句,不然acquire和release一定要成对出现 37 with self.cond: 38 print(‘{} : 小爱同学‘.format(self.name)) 39 # 通知 40 self.cond.notify() 41 # 等待 42 self.cond.wait() 43 print(‘{} : 我们来对古诗吧‘.format(self.name)) 44 # 通知 45 self.cond.notify() 46 # 等待 47 self.cond.wait() 48 49 50 if __name__ == ‘__main__‘: 51 cond = threading.Condition() 52 xiao_ai = XiaoAi(cond) 53 tian_mao = TianMao(cond) 54 55 # 启动的先后顺序很重要 56 # 在调用with方法,或者acquire方法之后,再调用wait和notify方法 57 xiao_ai.start() 58 tian_mao.start() 59 60 # 先启动tian_mao,会打印出‘小爱同学’,但程序会‘死掉’,这是因为self.cond.notify()通知已经发出去了 61 # 但是后面启动xiao_ai,xiao_ai的self.cond.wait()收不到通知。
天猫 : 小爱同学 小爱 : 在 天猫 : 我们来对古诗吧 小爱 : 好啊
以上是关于10.5线程同步--conditon 使用以及源码分析的主要内容,如果未能解决你的问题,请参考以下文章
AQS源码探究_06 Conditon条件队列(await方法线程入队与挂起signal方法)
AQS源码探究_06 Conditon条件队列(await方法线程入队与挂起signal方法)
AQS源码探究_05 Conditon条件队列(手写一个入门的BrokingQueue)