039条件变量同步(Condition)

Jacinth 2018-03-10

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

from random import randint
 import threading
 import time
 
 class Producer(threading.Thread):
     def run(self):
         global L
         while True:
             val = randint(0,100)
             print('生产者',self.name,':append',str(val),L)
             if lock_con.acquire():
                 L.append(val)
                 lock_con.notify()
                 lock_con.release()
             time.sleep(3)
 
 class Consumer(threading.Thread):
     def run(self):
         global  L
         while True:
             lock_con.acquire()
             if len(L) == 0:
                 lock_con.wait()
             print('消费者',self.name,'delete',str(L[0]),L)
             del L[0]
             lock_con.release()
         time.sleep(0.5)
 
 if __name__ == '__main__':
     L = []
     lock_con = threading.Condition()
     threads = []
     for i in range(5):
         threads.append(Producer())
         threads.append(Consumer())
     for t in threads:
         t.start()
     for t in threads:
         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()
多生产多消费

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

相关推荐