互斥锁

比如情景为抢票,余票为1张

from multiprocessing import Process
import os,time,json

def serach(i):
    with open("db.json","rt",encoding="utf-8") as f:
        data = json.load(f)
        time.sleep(1)
        print("路人%s看到余票还有%s" % (i,data["count"]))

def buy(i):
    with open("db.json","rt",encoding="utf-8") as f:
        data = json.load(f)
    if data["count"] > 0:
        time.sleep(1)
        data["count"] -= 1
        with open("db.json", "wt",encoding="utf-8") as f:
            json.dump(data,f)
        print("路人%s抢票成功。")
    else:
        print("路人%s抢票失败。")

def task(i):
    serach(i)
    buy(i)


if __name__ == "__main__":
    for i in range(10):
        p = Process(target=task, args=(i,))
        p.start()

结果为:

路人1看到余票还有1
路人0看到余票还有1
路人3看到余票还有1
路人2看到余票还有1
路人4看到余票还有1
路人5看到余票还有1
路人6看到余票还有1
路人7看到余票还有1
路人8看到余票还有1
路人9看到余票还有1
路人%s抢票成功。
路人%s抢票成功。
路人%s抢票成功。
路人%s抢票成功。
路人%s抢票成功。
路人%s抢票成功。
路人%s抢票成功。
路人%s抢票成功。
路人%s抢票成功。
路人%s抢票成功。

Process finished with exit code 0

看结果可以知道,最后变成了一张票十个人都买到了,数据不安全。

所以解决的办法是加互斥锁,不能十个人同时修改,而是一个个修改,既查看余票是并发的,购票是串行的。

速度变慢,但是数据安全了。

from multiprocessing import Process,Lock
import time,json

def serach(i):
    with open("db.json","rt",encoding="utf-8") as f:
        data = json.load(f)
        time.sleep(1)
        print("路人%s看到余票还有%s" % (i,data["count"]))

def buy(i):
    with open("db.json","rt",encoding="utf-8") as f:
        data = json.load(f)
    if data["count"] > 0:
        time.sleep(1)
        data["count"] -= 1
        with open("db.json", "wt",encoding="utf-8") as f:
            json.dump(data,f)
        print("路人%s抢票成功。" % i)
    else:
        print("路人%s抢票失败。" % i)

def task(i,mutex):
    serach(i)
    mutex.acquire()
    buy(i)
    mutex.release()


if __name__ == "__main__":
    mutex = Lock()
    for i in range(10):
        p = Process(target=task, args=(i,mutex,))
        p.start()

结果为:

路人0看到余票还有1
路人1看到余票还有1
路人2看到余票还有1
路人4看到余票还有1
路人5看到余票还有1
路人3看到余票还有1
路人6看到余票还有1
路人7看到余票还有1
路人8看到余票还有1
路人9看到余票还有1
路人0抢票成功。
路人1抢票失败。
路人2抢票失败。
路人4抢票失败。
路人5抢票失败。
路人3抢票失败。
路人6抢票失败。
路人7抢票失败。
路人8抢票失败。
路人9抢票失败。

Process finished with exit code 0

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值