进程同步锁

  • 我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,但是它们之间的运行没有顺序,一旦开启也不受我们控制。
  • 尽管并发编程让我们能更加充分的利用计算机的资源,但是也给我们带来了新的问题:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件是没有问题的,要是对同一文件进行读写操作呢?要知道共享带来的是竞争,竞争带来的结果就是错乱。
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 

注意点:加锁会失去异步效果