进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理
1.锁将并发变成了串行,牺牲了运行效率,但避免了竞争 2.锁在主进程中实例化产生,在子进程中使用 3.在修改数据处加锁,修改不同的数据用不同的锁
from multiprocessing import Process, Lock
import json
import time
# 查票
def search(name):
with open('data', 'r', encoding='utf-8') as f:
data = f.read() # 读出的是json模式的数据
t = json.loads(data).get('ticket')
print('用户%s查询余票为:%s'%(name, t))
# search('waller')
# 买票
def buy(name):
with open('data', 'r', encoding='utf-8') as f:
data_json = f.read() # 读出的是json模式的数据
data = json.loads(data_json)
t = data.get('ticket')
# 模拟抢票时间
time.sleep(2)
if not t > 0 :
print('已无票')
return
t -= 1
data['ticket'] = t
# 跟新数据
with open('data', 'w', encoding='utf-8') as f:
json.dump(data, f) # 将更新后的数据序列化到数据库中
print('用户%s,购票成功'%name)
# 在进程中调用 search 与 buy 函数
def run(name, mutex):
search(name)
mutex.acquire() # 抢锁 加锁,保证每次只有一个进程在执行锁里面的程序,这一段程序对于所有写上这个锁的进程,大家都变成了串行
buy(name) # 被锁的函数
mutex.release() # 释放锁
if __name__ == '__main__':
# 生成一把锁
mutex = Lock()
# 创建5个进程
for i in range(5):
p = Process(target=run, args=('waller',mutex))
p.start()
总结:加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全。
问题:虽然可以用文件共享数据显示进程间数据通信但问题是
- 效率低(共享数据基于文件,而文件是硬盘上的数据)
- 需要自己加锁处理