并发编程
进程的控制
锁Lock:加锁后,同一份资源只能一个进程去调用
信号量Semaphore:同一时间某一个资源可以同时允许指定个数的进程去访问
事件Event:通过信号来控制所有的进程同时执行或进入阻塞
信号量Semaphore
from multiprocessing import Semaphore
利用锁的原理实现的,内置了一个计数器,同一时间只有指定数量的进程能执行某一段锁定的代码
from multiprocessing import Process
from multiprocessing import Semaphore
import time
def fun(i,sem):
sem.acquire() #获取信号 相当于计数器-1
print('%s正在吃饭'%i)
time.sleep(3)
print('---%s吃完了饭'%i)
sem.release() #释放信号 相当于计数器+1
if __name__ == '__main__':
sem = Semaphore(3) #同时只允许3个进程同时访问
for i in range(10):
p = Process(target = fun,args = (i,sem))
p.start()
事件Event
from multiprocessing import Event
一个事件可以使所有的进程进入阻塞状态
也可以控制所有进程解除阻塞
一个事件被创建后默认是阻塞状态
from multiprocessing import Event
e = Event() #创建一个事件,默认是阻塞状态
print(e.is_set())#False 查看一个事件的状态,默认是阻塞状态
print('123') #正常输出,进程阻塞还依赖于wait()
e.set() #将事件的状态改为True,写在wait()之前
e.wait() #当前事件状态为false就阻塞当前代码
print('456')
e.clear() #将事件的状态改为False
#常常用于设定多个进程间的某种状态,判定当前进程是否继续执行
示例:红绿灯
from multiprocessing import Process , Event
import time
import random
def light(e):
while True:
if e.is_set():
e.clear() #将True改为False
print('红灯亮')
else:
e.set() #将False改为True
print('绿灯亮')
time.sleep(2)
def person(e):
if not e.is_set():#红灯
print('停止过马路')
e.wait()
print('开始过马路')
if __name__ == '__main__':
e = Event() #创建事件
p = Process(target = light,args = (e,))#创建进程
p.start()#启动进程
for i in range(20):
c = Process(target = person,args = (e,))
c.start()
time.sleep(random.randint(1,3))