信号量 某一段代码,同一时间,只能被N个进程使用
import time
import random
from multiprocessing import Porcess
from multiprocessing import Semaphore def ktv(i,sem):
sem.acquire() #获取钥匙
print('%s走进ktv'%i)
time.sleep(random.randint(1,5))
print('%s走出ktv'%i)
sem.release() #换钥匙 if __name__ == '__main__':
sem = Semaphore(4)
for i in range(20):
p = Process(target=ktv,agrs=(i,sem))
p.start()
事件案例
from multiprocessing import Event #事件 e = Event() #创建一个事件
print(e.is_set()) #查看时间状态,默认被设置阻塞
e.set() #将事件的状态改为True
e.wait() #是依据e.is_set()的值来决定是否阻塞True为不阻塞,False为阻塞
e.clear() #将事件的状态改为False
实例
红绿灯事件
# 红绿灯事件
import time
import random
from multiprocessing import Event,Process
def cars(e,i):
if not e.is_set():
print('car%i在等待'%i)
e.wait() # 阻塞 直到得到一个 事件状态变成 True 的信号
print('\033[0;32;40mcar%i通过\033[0m' % 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()
traffic = Process(target=light,args=(e,))
traffic.start()
for i in range(20):
car = Process(target=cars, args=(e,i))
car.start()
time.sleep(random.random())
红绿灯