zoukankan      html  css  js  c++  java
  • python Condition


    import
    threading
    # 必须要使用condition的例子
    # class XiaoAi(threading.Thread):
    # def __init__(self, lock):
    # super().__init__(name="小爱")
    # self.lock = lock
    #
    # def run(self):
    # self.lock.acquire()
    # print("{} : 在 ".format(self.name))
    # self.lock.release()
    #
    # self.lock.acquire()
    # print("{} : 好啊 ".format(self.name))
    # self.lock.release()
    #
    # class TianMao(threading.Thread):
    # def __init__(self, lock):
    # super().__init__(name="天猫精灵")
    # self.lock = lock
    #
    # def run(self):
    #
    # self.lock.acquire()
    # print("{} : 小爱同学 ".format(self.name))
    # self.lock.release()
    #
    # self.lock.acquire()
    # print("{} : 我们来对古诗吧 ".format(self.name))
    # self.lock.release()

    class XiaoAi(threading.Thread): def __init__(self, cond): super().__init__(name="小爱") self.cond = cond def run(self): with self.cond: self.cond.wait() print("{} : 在 ".format(self.name)) self.cond.notify() self.cond.wait() print("{} : 好啊 ".format(self.name)) self.cond.notify() self.cond.wait() print("{} : 君住长江尾 ".format(self.name)) self.cond.notify() self.cond.wait() print("{} : 共饮长江水 ".format(self.name)) self.cond.notify() self.cond.wait() print("{} : 此恨何时已 ".format(self.name)) self.cond.notify() self.cond.wait() print("{} : 定不负相思意 ".format(self.name)) self.cond.notify() class TianMao(threading.Thread): def __init__(self, cond): super().__init__(name="天猫精灵") self.cond = cond def run(self): with self.cond: print("{} : 小爱同学 ".format(self.name)) self.cond.notify() self.cond.wait() print("{} : 我们来对古诗吧 ".format(self.name)) self.cond.notify() self.cond.wait() print("{} : 我住长江头 ".format(self.name)) self.cond.notify() self.cond.wait() print("{} : 日日思君不见君 ".format(self.name)) self.cond.notify() self.cond.wait() print("{} : 此水几时休 ".format(self.name)) self.cond.notify() self.cond.wait() print("{} : 只愿君心似我心 ".format(self.name)) self.cond.notify() self.cond.wait() if __name__ == "__main__": cond = threading.Condition() xiaoai = XiaoAi(cond) tianmao = TianMao(cond) #启动顺序很重要 #在调用with cond之后才能调用wait或者notify方法 xiaoai.start() tianmao.start()

    condition有两层锁:

    1. 一把底层锁会在线程调用了wait方法的时候释放(是先创建一把锁(这就是第二把锁),然后再release),底层还是Lock或者RLock,

    2.第二把锁会在每次调用wait的时候创建一把新的,并放入到cond的等待队列中(采用的是dqueue),一直acquire,等到notify方法的唤醒。notify方法会出队一把锁,这把锁就是刚刚创建的锁,然后release。

  • 相关阅读:
    (四)使用SecureCRTPortable 连接虚拟机 安装jdk
    (三)配置本地YUM源
    (二) 配置 centos6.7
    docker学习
    linux磁盘情况查看处理
    日志文件切割
    已有项目创建git
    微擎绑定开放平台后依然拿不到唯一id?
    php7 安装mongodb扩展
    mongodb 学习
  • 原文地址:https://www.cnblogs.com/callyblog/p/11145972.html
Copyright © 2011-2022 走看看