进程同步锁
- 我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,但是它们之间的运行没有顺序,一旦开启也不受我们控制。
- 尽管并发编程让我们能更加充分的利用计算机的资源,但是也给我们带来了新的问题:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件是没有问题的,要是对同一文件进行读写操作呢?要知道共享带来的是竞争,竞争带来的结果就是错乱。
from multiprocessing import Process import json,time #在当前目录下创建一个文件(db) #文件db的内容:{count:1}表示的是余票数量 def search(): #查询余票 fp = open('db','r') dic = json.load(fp) #反序列化,将文件中的json数据转换成python字典 print('剩余车票数为:{}'.format(dic['count'])) def get(): #抢票,每次只能购买一张 fp = open('db', 'r') dic = json.load(fp) time.sleep(0.1) if dic['count'] > 0: time.sleep(0.2) dic['count'] -= 1 time.sleep(0.1) json.dump(dic, open('db', 'w')) #购票后,回写到文件中 print('购票成功') def task(): search() #先查询 get() #后购买 if __name__ == __main__: for i in range(3): p = Process(target=task) p.start() #运行结果 #剩余车票数为:1 #剩余车票数为:1 #剩余车票数为:1 #购票成功 #购票成功 #购票成功
- 上述案例中,总的票数只有1张,我们确成功购票三次。很明显存在问题。
- 如何控制,就是加锁处理
- 加锁流程
- 1.导包:from multiprocessing import Lock
- 2.加锁:lock.acquire()
- 3.解锁:lock.release()
- 加锁流程
- 下面我们还是以抢票为例,看看加锁后数据是否还会存在问题;
- 加锁后
from multiprocessing import Process import json,time from multiprocessing import Lock #在当前目录下创建一个文件(db) #文件db的内容:{count:1}表示的是余票数量 def search(): #查询余票 fp = open('db','r') dic = json.load(fp) #反序列化,将文件中的json数据转换成python字典 print('剩余车票数为:{}'.format(dic['count'])) def get(): #抢票,每次只能购买一张 fp = open('db', 'r') dic = json.load(fp) time.sleep(0.1) if dic['count'] > 0: time.sleep(0.2) dic['count'] -= 1 time.sleep(0.1) json.dump(dic, open('db', 'w')) #购票后,回写到文件中 print('购票成功') def task(lock): lock.acquire() #加锁 search() #先查询 get() #后购买 lock.release() #解锁 if __name__ == __main__: lock = Lock() #创建一把进程锁 for i in range(3): p = Process(target=task,args=(lock,)) p.start() #运行结果 #剩余车票数为:1 #购票成功 #剩余车票数为:0 #剩余车票数为:0
注意点:加锁会失去异步效果