原因:并发运行,效率高,但竞争写同一文件,数据写入错乱
加锁:购票行为由并发变成了串行,牺牲了运行效率,但保证了数据安全
通过mutex.acquire()加锁,mutex.release()解锁
也可通过with mutex实现自动加解锁
注意:join只能将进程的任务整体变成串行
代码:
import json
import time,random
from multiprocessing import Process,Lock
def search(name):
with open('db.json','rt',encoding='utf-8') as f:
dic=json.load(f)
time.sleep(1)
print('%s 查看到余票为 %s' %(name,dic['count']))
def get(name):
with open('db.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('db.json','wt',encoding='utf-8') as f:
json.dump(dic,f)
print('%s 购票成功' %name)
else:
print('%s 查看到没有票了' %name)
def task(name,mutex):
search(name) #并发
mutex.acquire()
get(name) #串行
mutex.release()
# with mutex:
# get(name)
if __name__ == '__main__':
mutex = Lock()
for i in range(5):
p=Process(target=task,args=('路人%s' %i,mutex))
p.start()
# p.join() # join只能将进程的任务整体变成串行
结果:
路人0 查看到余票为 1
路人1 查看到余票为 1
路人4 查看到余票为 1
路人2 查看到余票为 1
路人3 查看到余票为 1
路人0 购票成功
路人1 查看到没有票了
路人4 查看到没有票了
路人2 查看到没有票了
路人3 查看到没有票了
转载于:https://www.cnblogs.com/zhangshengxiang/p/9593057.html