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

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

 

转载于:https://www.cnblogs.com/TF511/p/9932247.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值