【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()收不到通知。
天猫 : 小爱同学
小爱 : 在
天猫 : 我们来对古诗吧
小爱 : 好啊

 

转载于:https://www.cnblogs.com/zydeboke/p/11298632.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值