一个模拟——抢票部分功能的 简单版(主要实例化一下 Lock 的使用)
""" 抢票! 多个用户在同时读写同一个数据 """ from multiprocessing import Process,Lock import json,time,random # 查看余票 def show_ticket(name): time.sleep(random.randint(1,3)) with open(r"ticket.json","rt",encoding="utf-8") as f: dic = json.load(f) print("%s查看 剩余票数:%s" % (name ,dic["count"])) # 购买票 def buy_ticket(name): # 购买前再次查询 with open(r"ticket.json", "rt", encoding="utf-8") as f: # 修改数据 dic = json.load(f) if dic["count"] > 0: dic["count"] -= 1 # 模拟网络延迟 time.sleep(random.randint(1,3)) # 模拟服务器收到数据 写入文件 with open(r"ticket.json", "wt", encoding="utf-8") as f2: json.dump(dic,f2) print("%s 购票成功!" % name) def task(lock,name): # 查看余票可以并发执行 不需要锁住 show_ticket(name) # 购票的操作需要锁 因为设涉及到同时修改数据 lock.acquire() buy_ticket(name) lock.release() if __name__ == '__main__': # 买个锁 mutex = Lock() # 所有子进程 必须是同一把锁,否则无法实现——锁定的状态 for i in range(11): p = Process(target=task,args=(mutex,"客户%s" % i)) p.start() # 查询票这个事情 可以多个进程同时执行 # 但是买票这个过程 不能同时进行 前一个没买完 后一个就不能买