一、信号量
信号量:一套资源 同一时间 只能被n个人访问
某一段代码 同一时间 只能被n个进程执行,控制访问人数
Semaphore用上锁的原理实现的,内置了一个计数器,在同一时间 只能有指定数量的进程执行被控制住代码
import random from multiprocessing import Process import time from multiprocessing import Semaphore def ktv(i, sem): sem.acquire() print("%s走进ktv" % i) time.sleep(random.randint(2, 3)) print("%s走出ktv" % i) sem.release() if __name__ == '__main__': sem = Semaphore(4) for i in range(20): p = Process(target=ktv, args=(i, sem)) p.start()
二、事件
# 通过一个信号 来控制 多个进程 同时执行或阻塞
# 事件 wait() 是依据事件的状态来决定自己是否在wait处阻塞
#False 阻塞 true不阻塞
# 一个信号可以使所有的进程都进入阻塞状态 # 也可以控制所有的进程解除阻塞 # 一个事件被创建之后,默认是阻塞状态 e = Event() # 创建了一个事件 print(e.is_set()) # False 查看一个事件的状态 # e.set() # 将这个事件的状态改为True # print(e.is_set()) # True # e.wait() # 是依据e.is_set()的值来决定是否阻塞 # print(12345) # e.clear() # 将这个事件的状态改为False # print(e.is_set()) # False # e.wait() # print(78910)
三、红绿灯事件
需求:模拟红绿灯
from multiprocessing import Process, Event import time, random def car(e, i): if not e.is_set(): print("