1.进程之锁机制
- 问题引出,进程之间不能进行资源共享,容易造成数据混乱
-
def getmoney(num): for i in range(100): num += 1 def setmoney(num): for i in range(100): num -= 1 if __name__ == '__main__': num = 100 p = Process(target=getmoney,args=(num,)) p1 = Process(target=setmoney,args=(num,)) p.start() p1.start() print(num)
-
def getmoney(num): for i in range(100): num.value += 1 time.sleep(0.01) def setmoney(num): for i in range(100): num.value -= 1 time.sleep(0.01) if __name__ == '__main__': num = Value('i',100) p = Process(target=getmoney,args=(num,)) p1 = Process(target=setmoney,args=(num,)) #进程p和p1相对于主进程来说是同步执行 #执行过程中会发生数据错乱 p.start() p1.start() #同步主进程 p.join() p1.join() print(num.value) #输出结果:93
#为什么会发生数据错乱
- 在计算机底层计算时,i+=1 其实是先tmp=i tmp+=1 i=tmp 所以可能tmp还没赋值给i,第二个进程就来了,直接覆盖了,所以会造成数据错乱!
1.模块Lock:
def getmoney(num,l): #为程序增加锁机制,不到释放锁的时候,程序会一直停留在其中 l.acquire() for i in range(100): num.value += 1 time.sleep(0.01) l.release() def setmoney(num,l): l.acquire() for i in range(100): num.value -= 1 time.sleep(0.01) l.release() if __name__ == '__main__': l = Lock() num = Value('i',100) p = Process(target=getmoney,args=(num,l)) p1 = Process(target=setmoney,args=(num,l)) #进程p和p1相对于主进程来说是同步执行 #执行过程中会发生数据错乱 p.start() p1.start() #同步主进程 p.join() p1.join() print(num.value)
2.信号机制
- semaphore模块:s = semaphore(5)同时控制五把钥匙
- 可以同时控制多个信号量,然后释放一个,再执行下一个
3.事件机制
Event模块:e = Event():
- e.set() #将is_set()设置为True
- e.clear() #将Is_set()设置为False
- e.wait() #当Is_set()为True时,为非阻塞,反之,为阻塞;
e = Event() print(e.is_set())#默认为False e.set() #将is_set设置为True,如果没有这句,遇到阻塞将不往下执行 print(123) print(e.is_set()) #这为True,wait()才会执行 e.wait() print(456) print(e.is_set()) #这也为True e.clear()#设置为False print(e.is_set()) e.wait()#执行不了,程序阻塞在此 print(555) #输出结果 False 123 True 456 True False