• 自学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对象来实现。

  • 相关阅读:
    Linux 基金会年度报告——没有人能离开 Linux 支持环境;树莓派翻新版将创建“新的”分支系统;AWS 发生中断,导致业务交付出现问题 | 开源日报
    Spring框架在Bean中的管理(第十一课)
    设计模式-外观模式
    HashMap 源码分析
    error:Illegal instruction (core dumped),离线下载安装这个other版本numpy
    水利部加快推进小型水库除险加固,大坝安全监测是重点
    mysql日志服务
    第十四届蓝桥杯模拟赛第一期试题【Java解析】
    java性能测试
    前端页面初步开发
  • 原文地址:https://blog.csdn.net/weixin_46066007/article/details/126321059