.net

.net

 

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()

 

posted on 2015-07-01 09:55  严杰  阅读(7223)  评论(0编辑  收藏  举报

导航