python 多线程Condition(转载分析)

 Condition(条件变量)通常与一个锁关联。需要在多个Contidion中共享一个锁时,可以传递一个Lock/RLock实例给构造方法,否则它将自己生成一个RLock实例。

  可以认为,除了Lock带有的锁定池外,Condition还包含一个等待池,池中的线程处于等待阻塞状态,直到另一个线程调用notify()/notifyAll()通知;得到通知后线程进入锁定池等待锁定。

构造方法: 
Condition([lock/rlock])

实例方法: 
  acquire([timeout])/release(): 调用关联的锁的相应方法。 
  wait([timeout]): 调用这个方法将使线程进入Condition的等待池等待通知,并释放锁。使用前线程必须已获得锁定,否则将抛出异常。 
  notify(): 调用这个方法将从等待池挑选一个线程并通知,收到通知的线程将自动调用acquire()尝试获得锁定(进入锁定池);其他线程仍然在等待池中。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常。 
  notifyAll(): 调用这个方法将通知等待池中所有的线程,这些线程都将进入锁定池尝试获得锁定。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常。

# ---- 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()  # 5. 获得锁
        print(self.name + ': 我已经把眼睛蒙上了') # 6 .打印
        self.cond.notify()   # 7.通知挂起的线程开始执行
        self.cond.wait()  # 8.线程挂起,释放锁
        print(self.name + ': 我找到你了 ~_~')     # 12.打印
        self.cond.notify() #13.通知线程准备执行
        self.cond.release()   # 14 释放锁
        print(self.name + ': 我赢了')  # 15.打印


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()  # 3.获得锁
        self.cond.wait()  # 4. 释放锁 #释放对琐的占用,同时线程挂起在这里,直到被notify并重新占有琐。             
        print(self.name + ': 我已经藏好了,你快来找我吧')    # 9.打印
        self.cond.notify() # 10.通知挂起的线程准备开始执行
        self.cond.wait()  # 11. 释放锁,线程挂起                
        self.cond.release()# 16.释放锁
        print(self.name + ': 被你找到了,哎~~~')#17.打印


cond = threading.Condition() 
seeker = Seeker(cond, 'seeker')
hider = Hider(cond, 'hider')
seeker.start() #  1.seeker线程启动  
hider.start() #   2.hider线程启动

 

posted @ 2017-05-07 21:45  1916  阅读(144)  评论(0)    收藏  举报