IPC(进程间通讯)

"""
 服务器要存储票数
 客户端要查看票数
 如果票数大于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()

 

上一篇:CF1450C2 Errich-Tac-Toe


下一篇:Mysql事物原理及锁