一个模拟——抢票部分功能的 简单版(主要实例化一下 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()

# 查询票这个事情 可以多个进程同时执行
# 但是买票这个过程  不能同时进行 前一个没买完 后一个就不能买

 

posted @ 2018-11-08 21:46  萤huo虫  阅读(224)  评论(0编辑  收藏  举报