目录
进程互斥锁
进程同步(multiprocess.Lock) 锁——multiprocess.Lock
进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的。
而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理。
# 多进程模拟抢票实例
# 文件db内容为: {"count":1}
# 注意一定要用双引号,不然json无法识别
from multiprocessing import Process,Lock
import time,json,random
def search():
dic = json.load(open('db'))
print('剩余票数: %s'%dic['count'])
def get():
dic = json.load(open('db'))
time.sleep(1)
if dic['count'] > 0:
dic['count'] -= 1
time.sleep(2)
json.dump(dic, open('db', 'w'))
print('购票成功')
def task():
search()
get()
if __name__ == '__main__':
for i in range(10): # 模拟10个客户端抢票
p = Process(target=task)
p.start()
# 引发问题:数据写入错乱。
# 互斥锁保证数据安全
from multiprocessing import Process,Lock
import time,json,random,time
def search():
dic = json.load(open('db'))
print('剩余票数:%s'%dic['count'])
def get():
dic = json.load(open('db'))
# 模拟读数据的网络延迟
time.sleep(random.random())
if dic['count'] > 0:
dic['count'] -= 1
# 模拟写数据的网络延迟
time.sleep(random.random())
json.dump(dic, open('db', 'w'))
print('购票成功')
else:
print('购票失败')
def task(lock):
search()
lock.acquire()
get()
lock.release()
if __name__ == '__main__':
lock = Lock()
for i in range(10):
p = Process(target=task, args=(lock,))
p.start()
总结:
加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全。