• 自学Python 53 多线程开发(三)使用Condition 对象


    Python 使用Condition 对象

    活动地址:CSDN21天学习挑战赛



      本篇在Python 多线程开发(一)和(二)的基础上,继续讲解Python多线程开发的相关内容,使用Condition 对象。


    一、使用Condition对象

      在Python程序中,使用Condition对象可以在某些事件触发或者达到特定的条件后才处理数据。Python 提供的Conditon对象的目的是实现对复杂线程同步问题的支持。Condition通常与一个锁关联,当需要在多个Contidion中共享一个锁时,可以传递一个Lock/RLock实例给构造方法,否则它将自己生成一个RLock实例。除了Lock带有的锁定池外,Condition还包含一个等待池,池中的线程处于状态图中的等待阻塞状态,直到另一个线程调用notify()/notifyAlI()通知:得到通知后线程进入锁定池等待锁定。
      例如在下面的实例中,演示了使用Condition对象实现一个捉迷藏游戏的过程。假设这个游戏由两个人来玩,Hider藏,Seeker找。游戏的规则如下所示:
      (1)游戏开始之后,Seeker 先把自己眼睛蒙上,蒙上眼睛后,就通知Hider。
      (2) Hider 接收通知后开始找地方将自己藏起来,藏好之后,再通知Seeker可以找了。
      (3) Seeker 接收到通知之后,就开始找Hider.
      实例的具体实现代码如下所示。

    #------Condition捉迷藏的游戏------
    import threading,time
    class Hider(threading.Thread):
        def __init__(self,cond,name):
            super(Hider, self).__init__()
            self.cond = cond
            self.name = name
        def run(self):
            time.sleep(1) # 确保先运行Seeker中的方法
            self.cond.acquire()
            print(self.name + ';我已经把眼睛蒙上了')
            self.cond.notify()
            self.cond.wait()
            print(self.name + ':我找到你了~~')
            self.cond.notify()
            self.cond.release()
            print (self.name + ':我赢了')
    class Seeker(threading.Thread):
        def __init__(self,cond,name):
            super(Seeker, self).__init__()
            self.cond = cond
            self.name = name
        def run (self):
            self.cond.acquire()
            self.cond.wait()       #释放对锁的占用,同时线程挂起在这里,直到被notify并重新占有锁
            print (self.name + ':我已经藏好了,你快来找我吧')
            self.cond.notify()
            self.cond .wait()
            self.cond.release()
            print (self.name +':被你找到了,哎~~')
    cond = threading.Condition ()
    seeker = Seeker(cond,'seeker')
    hider = Hider(cond,'hider')
    seeker.start()
    hider.start ()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

      在上述代码中,Hider 和 Seeker都是独立的个体,在程序中用两个独立的线程来表示。在这个模拟的游戏过程中,两者之间的行为有一定的时序关系,我们通过Condition对象来控制这种时序关系。本实例执行后会输出如下结果:
    在这里插入图片描述

      由此可见,如果想让线程一遍又一遍地重复通知某个事件,最好使用Condition对象来实现。

  • 相关阅读:
    一个简单好用安全的开源交互审计系统,支持SSH,Telnet,Kubernetes协议
    汉字风格迁移篇--SAFont:使用自我注意机制的自动字体合成
    算法刷题总结 (一) 数组
    第二章 Java基础语法
    赛事重启!第五届“强网”拟态防御国际精英挑战赛重磅归来!
    php-jwt简单鉴权使用方法
    2023/10/30-LED灯驱动开发
    windows server 2012安装教程
    ansible模块示例及说明
    2022最新版-李宏毅机器学习深度学习课程-P26RNN-2
  • 原文地址:https://blog.csdn.net/weixin_46066007/article/details/126321059