Python——信号量
信号量 某一段代码,同一时间,只能被N个进程使用
1 import time 2 import random 3 from multiprocessing import Porcess 4 from multiprocessing import Semaphore 5 6 def ktv(i,sem): 7 sem.acquire() #获取钥匙 8 print('%s走进ktv'%i) 9 time.sleep(random.randint(1,5)) 10 print('%s走出ktv'%i) 11 sem.release() #换钥匙 12 13 14 if __name__ == '__main__': 15 sem = Semaphore(4) 16 for i in range(20): 17 p = Process(target=ktv,agrs=(i,sem)) 18 p.start() 19
事件案例
1 from multiprocessing import Event #事件 2 3 e = Event() #创建一个事件 4 print(e.is_set()) #查看时间状态,默认被设置阻塞 5 e.set() #将事件的状态改为True 6 e.wait() #是依据e.is_set()的值来决定是否阻塞True为不阻塞,False为阻塞 7 e.clear() #将事件的状态改为False
红绿灯事件
1 # 红绿灯事件 2 import time 3 import random 4 from multiprocessing import Event,Process 5 def cars(e,i): 6 if not e.is_set(): 7 print('car%i在等待'%i) 8 e.wait() # 阻塞 直到得到一个 事件状态变成 True 的信号 9 print('\033[0;32;40mcar%i通过\033[0m' % i) 10 11 def light(e): 12 while True: 13 if e.is_set(): 14 e.clear() 15 print('\033[31m红灯亮了\033[0m') 16 else: 17 e.set() 18 print('\033[32m绿灯亮了\033[0m') 19 time.sleep(2) 20 21 if __name__ == '__main__': 22 e = Event() 23 traffic = Process(target=light,args=(e,)) 24 traffic.start() 25 for i in range(20): 26 car = Process(target=cars, args=(e,i)) 27 car.start() 28 time.sleep(random.random())