Python 多线程 Condition 的使用
Condition
Condition(条件变量)通常与一个锁关联。需要在多个Contidion中共享一个锁时,可以传递一个Lock/RLock实例给构造方法,否则它将自己生成一个RLock实例。
可以认为,除了Lock带有的锁定池外,Condition还包含一个等待池,池中的线程处于状态图中的等待阻塞状态,直到另一个线程调用notify()/notifyAll()通知;得到通知后线程进入锁定池等待锁定。
构造方法:
Condition([lock/rlock])
实例方法:
acquire([timeout])/release(): 调用关联的锁的相应方法。
wait([timeout]): 调用这个方法将使线程进入Condition的等待池等待通知,并释放锁。使用前线程必须已获得锁定,否则将抛出异常。
notify(): 调用这个方法将从等待池挑选一个线程并通知,收到通知的线程将自动调用acquire()尝试获得锁定(进入锁定池);其他线程仍然在等待池中。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常。
notifyAll(): 调用这个方法将通知等待池中所有的线程,这些线程都将进入锁定池尝试获得锁定。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常。
常见使用:
1 #coding=utf-8 2 __author__ = 'Bruce_Zhou' 3 import threading 4 import time 5 import datetime 6 num = 0 7 con = threading.Condition() 8 9 class Gov(threading.Thread): 10 def __init__(self): 11 super(Gov, self).__init__() 12 13 def run(self): 14 global num 15 con.acquire() 16 while True: 17 print "开始拉升股市" 18 num += 1 19 print "拉升了" + str(num) + "个点" 20 time.sleep(2) 21 if num == 5: 22 print "暂时安全!" 23 con.notify() 24 con.wait() 25 con.release() 26 27 28 class Consumers(threading.Thread): 29 def __init__(self): 30 super(Consumers, self).__init__() 31 32 def run(self): 33 global num 34 con.acquire() 35 while True: 36 if num > 0: 37 print "开始打压股市" 38 num -= 1 39 print "打压了" + str(num) + "个点" 40 time.sleep(2) 41 if num == 0: 42 print "你妹的!天台在哪里!" 43 con.notify() 44 con.wait() 45 con.release() 46 47 if __name__ == '__main__': 48 p = Gov() 49 c = Consumers() 50 p.start() 51 c.start()