039条件变量同步(Condition)

也是锁,这个锁多加了wait(),notify()唤醒一个进程,notifyall()唤醒全部进程方法,创建的时候默认是Rlock类型的锁,可以设置为lock类型的,默认就ok

 1 from random import randint
 2 import threading
 3 import time
 4 
 5 class Producer(threading.Thread):
 6     def run(self):
 7         global L
 8         while True:
 9             val = randint(0,100)
10             print('生产者',self.name,':append',str(val),L)
11             if lock_con.acquire():
12                 L.append(val)
13                 lock_con.notify()
14                 lock_con.release()
15             time.sleep(3)
16 
17 class Consumer(threading.Thread):
18     def run(self):
19         global  L
20         while True:
21             lock_con.acquire()
22             if len(L) == 0:
23                 lock_con.wait()
24             print('消费者',self.name,'delete',str(L[0]),L)
25             del L[0]
26             lock_con.release()
27         time.sleep(0.5)
28 
29 if __name__ == '__main__':
30     L = []
31     lock_con = threading.Condition()
32     threads = []
33     for i in range(5):
34         threads.append(Producer())
35         threads.append(Consumer())
36     for t in threads:
37         t.start()
38     for t in threads:
39         t.join()
使用例子

 

###########java改编:单生产单消费

 1 import time
 2 import threading
 3 
 4 class Res:
 5     def __init__(self):
 6         self.flag = False
 7         self.count = 0
 8         self.product = ''
 9 
10     def set(self,name):
11         lock_con.acquire()
12         if self.flag:
13             lock_con.wait()
14         time.sleep(0.00001)
15         self.count += 1
16         self.product = ''.join([name,'**',str(self.count)])
17         self.message = ''.join([self.product,'__生产者__',str(threading.current_thread())])
18         print(self.message)
19         self.flag = True
20         lock_con.notify()
21         lock_con.release()
22 
23     def get_product(self):
24         lock_con.acquire()
25         time.sleep(0.00001)
26         if not self.flag:
27             lock_con.wait()
28         self.message = ''.join([self.product,'__消费者__',str(threading.current_thread())])
29         print(self.message)
30         self.flag = False
31         lock_con.notify()
32         lock_con.release()
33 
34 class Producer(threading.Thread):
35     def __init__(self,r):
36         threading.Thread.__init__(self)
37         self.r = r
38 
39     def run(self):
40         for i in range(100):
41             self.r.set('大白兔奶糖')
42 
43 class Consumer(threading.Thread):
44     def __init__(self,r):
45         threading.Thread.__init__(self)
46         self.r = r
47 
48     def run(self):
49         for i in range(100):
50             self.r.get_product()
51 
52 if __name__ == '__main__':
53     lock_con = threading.Condition()
54     r = Res()
55     c = Consumer(r)
56     p = Producer(r)
57     c.start()
58     p.start()
单生产单消费

 

############多生产多消费

 1 import time
 2 import threading
 3 
 4 class Res:
 5     def __init__(self):
 6         self.flag = False
 7         self.count = 0
 8         self.product = ''
 9 
10     def set(self,name):
11         lock_con.acquire()
12         while self.flag:
13             lock_con.wait()
14         time.sleep(0.00001)
15         self.count += 1
16         self.product = ''.join([name,'**',str(self.count)])
17         self.message = ''.join([self.product,'__生产者__',str(threading.current_thread())])
18         print(self.message)
19         self.flag = True
20         lock_con.notifyAll()
21         lock_con.release()
22 
23     def get_product(self):
24         lock_con.acquire()
25         time.sleep(0.00001)
26         while not self.flag:
27             lock_con.wait()
28         self.message = ''.join([self.product,'__消费者__',str(threading.current_thread())])
29         print(self.message)
30         self.flag = False
31         lock_con.notifyAll()
32         lock_con.release()
33 
34 class Producer(threading.Thread):
35     def __init__(self,r):
36         threading.Thread.__init__(self)
37         self.r = r
38 
39     def run(self):
40         for i in range(100):
41             self.r.set('大白兔奶糖')
42 
43 class Consumer(threading.Thread):
44     def __init__(self,r):
45         threading.Thread.__init__(self)
46         self.r = r
47 
48     def run(self):
49         for i in range(100):
50             self.r.get_product()
51 
52 if __name__ == '__main__':
53     lock_con = threading.Condition()
54     r = Res()
55     l = []
56     for i in range(5):
57         l.append(Consumer(r))
58     for i in range(5):
59         l.append(Producer(r))
60     for a in l:
61         a.start()
多生产多消费

 

个人觉得例子理解是最好的,所以我学的东西一般使用例子

posted @ 2018-03-10 14:53  Alos403  阅读(254)  评论(0编辑  收藏  举报