比如情景为抢票,余票为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