一***进程 锁 信号量
1.守护进程的定义:
1. 在开启子进程之前要设置守护进程
2. 作用:守护主进程代码结束,如果子进程还要运行就会跟着主进程一起结束---可以避免形成僵尸进程。
2.锁为了解决数据安全
1.并行机制等待依赖着运行完之后才可以进行,
2.保证多个进程修改同一块数据的时候,同一时间只能修改一 块数据,即串行的修改,速度慢了但是会保证数据的安全
3.multiprocessing.Lock
lock=Lock()
lock.acquire() #获得锁
print("Hello World ! ! !")
lock.release() #释放锁
3.信号量=锁+计数器
sem=Semaphore(5) #同一时间可以允许五个同时开启
#类+()实例化对象得到的实例用锁得方法acquire release
#信号量的机制来模仿可以允许最大接收量
def room(i,sem):
sem.acquire()
print("%s走进房间" % i)
time.sleep(random.random())
print("%s走出房间" % i)
sem.release()
if __name__ =='__main__':
sem = Semaphore(3)
list=[]
for iin range(10):
p=Process(target=room,args=(i+1,sem))
p.start()
list.append(p)
for jin list:
j.join()
二***事件
1.事件:控制进程执行还是阻塞一个机制
wait等待方法:在事件中有一个标志为True 执行效果为pass继续执行
这个标志为False,wait方法的效果是阻塞,直到变为True
2.事件的控制标志:
is_set 判断标志的状态
set 方法 将标志设置为True
clear方法 将方法设置为False
#事件实例化出对象
# e=Event()
# print(e.is_set()) #默认标志为False 查看标志状态
# e.set() #调用set方法变为True
# print(e.is_set())
# e.wait() #等待标志
# print("Hello World")
# e.clear() #将表值设为False
# print(e.is_set())
def func(e):
e.wait()
print("Hello World")# if __name__ == '__main__':
e=Event()
p=Process(target=func,args=(e,))
p.start()
e.set() #将标志状态设为True
print(e.is_set())
#交通状况红绿灯 车通行
def traffic(e):
while True:
#红灯的话用clear标志变为False绿灯的话用set设置为True
if e.is_set(): #is_set()==True
e.clear()
print("\033[31m 红灯停 \033[0m")
time.sleep(1)
else:
e.set()
print("\033[32m 绿灯行 \033[0m")
time.sleep(1)
def car(e,i):
if e.is_set==False:# not e.is_set
print("%s 号车等待通过" %(i+1))
e.wait()
print("%s 号车成功通过" % (i+1))
if __name__ =='__main__':
e=Event()
q=Queue()
tra=Process(target=traffic,args=(e,))
tra.start()
for iin range(10):
cra=Process(target=car,args=(e,i))
cra.start()