############### 多进程的信号量 ##############
# 多进程的信号量 from multiprocessing import Process import time,random from multiprocessing import Semaphore # ktv只有1个房间,1个房间只能装4个人,但是这样写就是20个人都进入到房间了, # 假设ket门口有4把钥匙,一个进程来了那一把钥匙,然后关门,这样只有4个进程能拿到,剩下的之后1个进程出来了才可以继续其他的进程, # 这个概念就叫做信号量,同一时间就只有四个人, def ktv(i,sem): sem.acquire() # 获取钥匙 print("%d进入ktv"%i) time.sleep(random.randint(60,180)) # 这是每一个人唱歌1-3分钟 print("%d走出ktv"%i) sem.release() # 还钥匙 if __name__ == "__main__": sem = Semaphore(4) # 这就是设置有多少把钥匙, 信号量的英文就是:Semaphore for i in range(20): p=Process(target=ktv,args=(i,sem)) p.start()
############### 进程的事件 ##############
# 进程的事件 # 事件 import time from multiprocessing import Event, Process # 一个信号,可以使所有的进程都进入阻塞状态,也可以控制所有信号都解除阻塞, # 一个事件创建之后,默认是阻塞状态, # e = Event() # 创建一个事件 # print(e.is_set()) # 查看一个事件是否是阻塞状态, # print(123445) # e.set() # 这是把阻塞的状态改为true, # print(e.is_set()) # e.wait() # 根据e.is_set()的结果,如果是false,就会阻塞,如果是true就会不阻塞 # print(12344) # e.clear() # 这是把阻塞的状态改为false # print(e.is_set()) # e.wait() # 虽然阻塞了,但是一定要有这个wait,才会阻塞后面的代码, # print(444444) # 举一个例子,红绿灯 # 每一个进程表示一辆车, def car(e,i): #e.is_set() 默认返回False 代表的是绿灯 if not e.is_set(): print("car%s在等待"%i) e.wait() print("car%s通行了"%i) def light(e): while True: if e.is_set(): e.clear() print('\033[31m红灯亮了\033[0m') else: e.set() print('\033[32m绿灯亮了\033[0m') time.sleep(2) if __name__ == '__main__': e=Event() # 模拟启动交通灯 p1=Process(target=light,args=(e,)) p1.daemon=True p1.start() #模拟20辆小车 for i in range(20): import random time.sleep(random.uniform(0,2)) p2=Process(target=car,args=(e,i)) p2.start() print("程序彻底结束!")