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。

  • 相关阅读:
    阅读第十到十二章有感
    程序测试学习之5.2作业
    作业五——封装
    作业4 阅读《构建之法》第6 第7章有感
    汉堡包~~~
    作业3 阅读《构建之法》1-5章
    结对子实验——小学生四则运算
    小学生四则运算程序
    学会提问(转)
    error of “omission” and “commission”
  • 原文地址:https://www.cnblogs.com/callyblog/p/11145972.html
Copyright © 2011-2022 走看看