互斥锁理论
'''
多个线程同时要修改同一份数据,类似抢票等,
都需要用到互斥锁 虽然影响效率,但保证数据安全
'''
import json
from multiprocessing import Process, Lock
import multiprocessing
import time
import os
import random
# 查票
def search(i):
# 读取票数
with open('火车票.txt', 'r', encoding='utf8') as f:
dic = json.load(f)
print(f'用户:{i},查询票数:{dic.get("ticket_num")}')
# 买票 1,先查 2,再买
def buy(i):
with open('火车票.txt', 'r', encoding='utf8') as f:
dic = json.load(f)
time.sleep(random.randint(1, 3))
# 判断当前是否有票
if dic.get('ticket_num') > 0:
dic['ticket_num'] -= 1
with open('火车票.txt', 'w', encoding='utf8') as f:
json.dump(dic, f)
print(f'用户:{i}购票成功')
else:
print(f'用户:{i}购票失败')
# 整合功能函数
def run(i, mutex):
search(i)
# 给买票环节加锁处理
# 先抢锁
mutex.acquire()
# 抢锁
buy(i)
mutex.release()
# 释放锁
if __name__ == '__main__':
# 在主进程生产一把锁,所有子进程抢
# 谁抢到了锁就可以进去买
multiprocessing.set_start_method('fork')
# mac 系统需要加这一行
mutex = Lock()
for i in range(1, 10):
p = Process(target=run, args=(i, mutex,))
p.start()
'''
多个进程 操作同一份数据的时候,会出现数据错乱的问题
针对上述问题,解决方式就是加锁处理
加锁可以将并发编程串行,牺牲了效率,保证了数据安全
'''