lock (互斥锁)
** 模拟抢票**
子进程1: 读取票数,更新票数
子进程2: 抢票方法
(1) 读取数据的实际票数
(2)判断票数(如果大于0,抢票成功,票数-=1)
(3)更新数据库
(4)否则else等于0,抢票失败
子进程3:
1.查询票数(调用子进程1的r票数方式)
2.上锁: 遇到require上锁之后,进程变成同步
3.抢票
4.解锁
主进程: p.start() 启动
import json
1.读取票数,更新票数
def wr_info(sign,dic=None):
if sign == "r":
with open("ticket",mode="r",encoding="utf-8") as fp:
dic = json.load(fp)
return dic
elif sign == "w":
with open("ticket",mode="w",encoding="utf-8") as fp:
json.dump(dic,fp)
2.抢票的方法
def get_ticket(person):
dic = wr_info("r") # 读取数据库当中的实际票数
# print(dic)
# time.sleep(0.1) 为了防止数据错乱,造成报错,如果加锁了,这句话可以删掉;
if dic["count"] > 0:
print("%s抢票成功" % (person))
dic["count"] -= 1
wr_info("w",dic) # 更新数据库
else:
print("%s抢票失败" % (person))
3.用ticket来进行函数的统一调用
def ticket(person,lock):
dic = wr_info("r") # 查询票数
print("%s 查询票数 : %s " % (person,dic["count"]))
lock.acquire() # 遇到了acquire上锁之后,进程之间变成同步
get_ticket(person) # 开始抢票
lock.release()
if __name__ == "__main__":
lock = Lock()
for i in range(10):
p = Process(target=ticket,args=("person%s" % (i) ,lock))
p.start()