一.Lock
当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题
加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改
lock=Lock() lock.acquire() # 拿钥匙进门 lock.release() # 还钥匙
抢票系统
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from multiprocessing import Process from multiprocessing import Lock import json import time # def show_ticket(): # with open(a,"r",encoding="utf-8") as f: # dic=json.load(f) #用load # print("余票为%s"%(dic["ticket"])) def buy_ticket(i,lock): lock.acquire() # 拿钥匙进门 with open("D:lianxipython网络编程和并发编程d37\ticket","r",encoding="utf-8") as f: dic=json.load(f) if dic["ticket"] >=1: dic["ticket"]-=1 print("%s买到了票"%i) else: print("%s没买到票"%i) time.sleep(0.1) with open("D:lianxipython网络编程和并发编程d37\ticket", "w", encoding="utf-8") as f: json.dump(dic,f) lock.release() # 还钥匙 if __name__ == "__main__": lock=Lock() for i in range(5): # p=Process(target=show_ticket) # p.start() p1 = Process(target=buy_ticket,args=(i,lock)) p1.start()
二.Semaphore 上n把锁
from multiprocessing import Semaphore
ktv实例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import time from multiprocessing import Semaphore from multiprocessing import Process def go_ktv(i,sem): sem.acquire() print("%s进了ktv"%i) time.sleep(1) print("%s出了ktv"%i) sem.release() if __name__ == "__main__": sem=Semaphore(4) for i in range(10): p=Process(target=go_ktv,args=(i,sem)) p.start()
三.Event 事件
e=Event()全局定义了一个事件e
创建时状态默认为False
set和clear 分别修改一个事件的状态 True False
is_set查看事件的状态 wait 根据事件的状态决定是否阻塞
全局定义了一个“Flag”,如果“Flag”值为 False那么当程序执行 event.wait 方法时就会阻塞,
如果“Flag”值为True,那么event.wait 方法时便不再阻塞。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from multiprocessing import Event e=Event() print(e.is_set()) e.wait() print(666) #set.clear() ### e=Event() print(e.is_set()) e.set() 将“Flag”设置为True e.wait() print(666) e.clear() 将“Flag”设置为False e.wait() #不用e.wait 会正常显示 print(777)
红绿灯实例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from multiprocessing import Event,Process import time import random def car(e,i): if not e.is_set(): print("