1.一段代码一段时间被一个人访问可以使用lock方法,如果一段代码同一时间被n个进程访问/或者说被n个进程执行用甚么指令?
使用semaphore
第一段代码:

from multiprocessing import Process,Semaphore import time def ktv(i): print('%s走了进来'%i) time.sleep(2) print('%s走了出来'%i) if __name__=='__main__': for i in range(20): s=Semaphore(4) p=Process(target=ktv,args=(i,)) p.start() 结果为 3走了进来 8走了进来 0走了进来 4走了进来 6走了进来 11走了进来 10走了进来 7走了进来 5走了进来 1走了进来 12走了进来 18走了进来 15走了进来 16走了进来 2走了进来 14走了进来 9走了进来 17走了进来 13走了进来 19走了进来 3走了出来 8走了出来 0走了出来 4走了出来 6走了出来 11走了出来 10走了出来 7走了出来 5走了出来 1走了出来 12走了出来 18走了出来 15走了出来 16走了出来 2走了出来 14走了出来 9走了出来 17走了出来 13走了出来 19走了出来
从结果我们可以发现所有人都可以进入此ktv但时此ktv只有4个房间,很明显不合理:
第二段代码:

from multiprocessing import Process,Semaphore import time def ktv(i,s): s.acquire() #获取钥匙 print('%s走了进来'%i) time.sleep(2) print('%s走了出来'%i) s.release() #进行要是归还 if __name__=='__main__': s=Semaphore(4) #创建类并进行允许数量的控制,及一个计数信号量 for i in range(20): p=Process(target=ktv,args=(i,s)) p.start() 结果为4走了进来 3走了进来 1走了进来 8走了进来 4走了出来 0走了进来 3走了出来 6走了进来 1走了出来 2走了进来 8走了出来 7走了进来 0走了出来 11走了进来 6走了出来 10走了进来 2走了出来 14走了进来 7走了出来 5走了进来 11走了出来 13走了进来 10走了出来 17走了进来 14走了出来 9走了进来 5走了出来 16走了进来 13走了出来 12走了进来 17走了出来 18走了进来 9走了出来 15走了进来 16走了出来 19走了进来 12走了出来 18走了出来 15走了出来 19走了出来
2.信号:
一个信号可以使所有的进程都进入堵塞状态,也可使所有控制的进程都接触堵塞状态,一个事件被创建之后,默认是堵塞状态

from multiprocessing import Event a=Event() #创建了一个事件的类 print(a.is_set()) #查看现在事件的状态#默认状态时False a.wait() print('1900')#如果事件状态为False则指令不执行 结果为 False
那么怎么才能让程序执行那:使用对象.set

from multiprocessing import Event a=Event() #创建了一个事件的类 print(a.is_set()) #查看现在事件的状态#默认状态时False a.set() #将事件状态转为True a.wait() print(a.is_set()) print('1900')#如果事件状态为True则指令执行 结果为 False True 1900
那么怎么才能把程序转为False

from multiprocessing import Event a=Event() #创建了一个事件的类 print(a.is_set()) #查看现在事件的状态#默认状态时False a.set() #将事件状态转为True a.wait() print(a.is_set()) print('1900')#如果事件状态为True则指令执行 a.clear() print(a.is_set()) a.wait()#根据is_set的值来确定是否进行堵塞,没有这一步堵塞与否执行不起来 print('12345') 结果为 False True 1900 False
总结:set和clear用来改变事件的运行状态,is_set()是用来判别事件现在的状态,wait根据is_set()的值来判断是否堵塞
3.红绿灯程序

from multiprocessing import Process import time def traffic_light(): while True: print('