""" 服务器要存储票数 客户端要查看票数 如果票数大于0就可以购买 在使用锁的时候 无可避免的会降低效率 需要找到一个最合适的地方加上锁 你锁住的代码越少效率越高 join 和 锁 join是让整个进程中的代码全部串行 而锁可以部分代码串行 粒度(被锁住的代码量)越小 效率越高 互斥锁 互相排斥对方的锁 a在执行 b就滚一边去 """ import json,time,random,os from multiprocessing import Process,Lock def task(lock,name): # 查看余票 check_tick(name) # 买票会修改数据 必须加锁 lock.acquire() # 购票 bu_tick(name) lock.release() def check_tick(name): # time.sleep(random.randint(1,4)) with open("data.json","rt",encoding="utf-8") as f: tic = json.load(f)["titck"] print("%s查看了票数 剩余票数:%s" % (name,tic)) def bu_tick(name): # 先查询是否有余票 # time.sleep(random.randint(1, 4)) with open("data.json", "rt", encoding="utf-8") as f: tic_dic = json.load(f) if tic_dic["titck"] > 0: # 买票 需要发送请求 模拟延迟 tic_dic["titck"] -= 1 with open("data.json","wt",encoding="utf-8")as f1: json.dump(tic_dic,f1) print("%s 购买成功!" % name) else: print("没票了 抢票失败 要不要来个加速包??") if __name__ == '__main__': # 创建一个锁 lock = Lock() p1 = Process(target=task,args=(lock,"大导演")) p2 = Process(target=task,args=(lock,"渣渣辉")) p3 = Process(target=task,args=(lock,"古天乐")) p1.start() # p1.join() p2.start() # p2.join() p3.start() # p3.join()