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。

  • 相关阅读:
    缓存
    vue 生命周期:
    mongodb 数据库 增删改查
    微信小程序左右分类滚动列表
    4月29日记
    什么是MVVM
    什么是mvc
    React路由
    TodoList案例
    React中兄弟组件传值
  • 原文地址:https://www.cnblogs.com/callyblog/p/11145972.html
Copyright © 2011-2022 走看看