039条件变量同步(Condition)
也是锁,这个锁多加了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()多生产多消费个人觉得例子理解是最好的,所以我学的东西一般使用例子
相关推荐
Magicsoftware 2020-06-01
xuguiyi00 2020-03-04
sschencn 2020-01-18
wanggongzhen 2020-01-09
freedomwind00 2019-11-19
LUOPING0 2010-09-30
leeknives 2017-10-14
vickytong0 2016-07-20
揅笑晏晏 2015-09-28
joyjoy0 2017-03-22
chunjiekid 2019-04-26
linuxunix 2014-08-05
allentony 2019-04-21
RopenYuan 2013-11-27
GQ00 2019-04-16
beatlinux 2009-12-08
喝咖啡的IT羊 2009-12-08
dannistang 2008-08-13
linuxunix 2007-09-12