Day39.互斥锁
1.互斥锁_模拟多用户抢票功能流程
创建文本文件data,加入字典{"ticket_mum": 0},设定余票数
''' 互斥锁(Lock): 多个进程操作同一份数据的时候,会出现数据错乱的问题,针对上述问题,解决方式就是加速处理: 核心:将并发变成串行,牺牲效率但是保证了数据的安全 ''' from multiprocessing import Process, Lock import json import time import random # todo 查票 def search(i): # todo 文件操作读取票数 with open(r'C:\Users\WXE5SZH\Desktop\task\python_study\Day39\data', 'r', encoding='UTF-8') as f: dic = json.load(f) print('用户{}查询余票:{}'.format(i, dic.get('ticket_mum'))) # todo 买票 # todo 1. 先查 2. 再买 def buy(i): # todo 先查票 with open(r'C:\Users\WXE5SZH\Desktop\task\python_study\Day39\data', 'r', encoding='UTF-8') as f: dic = json.load(f) # print('用户{}查询余票:{}'.format(i, dic.get('ticket_mum'))) # todo 模拟网络延迟 time.sleep(random.randint(1, 3)) # todo 判断当前是否有票 if dic.get('ticket_mum') > 0: # todo 修改数据库 买票 dic['ticket_mum'] -= 1 # todo 写入数据库 with open(r'C:\Users\WXE5SZH\Desktop\task\python_study\Day39\data', 'w', encoding='UTF-8') as f: json.dump(dic, f) print('用户{}买票成功'.format(i)) else: print('用户{}买票失败'.format(i)) def run(i, mutex): search(i) # todo 给买票环节解锁处理 # todo 抢锁 mutex.acquire() buy(i) # todo 释放锁 mutex.release() if __name__ == '__main__': # todo 在主进程中生成一把锁,让所有的子进程抢,谁先抢到谁先买票 mutex = Lock() # todo 开启多进程 for i in range(1, 11): p = Process(target=run, args=(i, mutex)) p.start() ''' 扩展:行锁,表锁 注意: 1. 锁不要轻易使用,容易造成死锁现象(一般不会用到,都是内部封装好的) 2. 锁只在处理数据的部分加,保证数据安全(只在争抢数据的环节加锁处理即可) '''