zoukankan      html  css  js  c++  java
  • 【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()收不到通知。
    天猫 : 小爱同学
    小爱 : 在
    天猫 : 我们来对古诗吧
    小爱 : 好啊
    
  • 相关阅读:
    利用Python对文件进行批量重命名
    应用程序处于中断模式-设置方法
    idea http请求的插件(测试接口方便)
    ajax 分页(jquery分页插件pagination) 小例3
    JProfile 9.2 linux安装及windows客户端远程监控
    serializeObject 的应用
    linux下 mysql数据库的备份和还原
    ajax 分页(jquery分页插件pagination) 小例2
    bootstrapTable 应用小例(收索)
    表格 td中,取checkbox后几位值
  • 原文地址:https://www.cnblogs.com/zydeboke/p/11298632.html
Copyright © 2011-2022 走看看