【一】互斥锁
1.通常用于多线程编程时访问临界区(共享资源,且同时间只允许一个进程访问),为了保证数据的安全性
2.若没有互斥锁,如果资源只有一个,那么多个进程没有互斥锁,会出现多个进程访问同一个资源,会出现问题
3.加了锁会让并发变成串行
4.锁不要轻易使用,容易造成死锁现象
mutex = Lock()
mutex.acquire() # 抢锁
mutex.release() # 放锁
案例:抢票系统
import json
from multiprocessing import Process,Lock
def seacher(name):
with open('D:\pycharm\pxrj\网络并发\job\互斥锁\\ticket.json',mode='r',encoding='utf_8') as fp:
data=json.load(fp)
print(f"{name}查询当前剩余{data['ticket']}张票")
def buy(name):
with open('D:\pycharm\pxrj\网络并发\job\互斥锁\\ticket.json','r',encoding='utf_8') as fp:
data=json.load(fp)
ticket=data["ticket"]
if ticket==0:
print(f"对不起{name}没票了")
else:
with open('D:\pycharm\pxrj\网络并发\job\互斥锁\\ticket.json', 'w',encoding='utf_8') as fp:
data["ticket"]-=1
json.dump(data,fp)
print(f"{name}抢票成功")
def run(name,mutex):
seacher(name)
mutex.acquire()
buy(name)
mutex.release()
if __name__ == '__main__':
# wri()
# print(read())
mutex = Lock()
#创建要买票的进程
for i in range(5):
p=Process(target=run,args=(f'用户{i+1}',mutex))
p.start()
"""
from multiprocessing import Process, Lock
mutex = Lock()
mutex.acquire() # 抢锁
mutex.release() # 放锁
"""
"""
锁相关知识
行锁:针对行数据加锁 同一时间只能一个人操作
表锁:针对表数据加锁 同一时间只能一个人操作
锁的应用范围很广 但是核心都是为了保证数据的安全!!!
"""