前言
上篇博客的内容是守护进程,对于操作系统来说可以在后台执行一些程序.这篇的内容是互斥锁,在上上篇博客上说到进程内存空间互相隔离,所以可以通过共享文件来操作同一个文件,那么这样操作的话会发生什么呢?
锁
互斥锁
多个进程需要共享数据时,先将其锁定,此时资源状态为'锁定',其他进程不能更改;知道该进程释放资源,将资源的状态变成非'锁定',其他的线程才能再次锁定该资源.互斥锁保证了每次只有一个进程进入写入操作,从而保证了多进程情况下数据的正确性.
我们使用一个demo 来模拟多个进程操作同一个文件:
import json import time,random from multiprocessing import Process  def show_tickets(name):     time.sleep(random.randint(1,3))     with open('ticket.json', 'rt', encoding='utf-8') as f:         data = json.load(f)         print('%s 查看 剩余票数: %s' % (name, data['count']))  def buy_ticket(name):     with open('ticket.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('ticket.json', 'wt', encoding='utf-8') as f:                 json.dump(dic, f)                 print('%s: 购票成功' % name)  def task(name):     show_tickets(name)     buy_ticket(name)  if __name__ == '__main__':     for i in range(1,11):         p = Process(target=task, args=(i,))         p.start()运行结果:

在 ticket.json 里面只有一张票,结果却造成多个用户购买成功,这很显然是不符合实际情况的. 
那么怎么解决呢?如果多个进程对同一个文件进行读操作可以不进行限制,但是对同一个文件进行写操作就必要要进行限制,不可以同时多个人对同一个文件进行写操作.python 在多进程模块里提供一个类, Lock 类,当进程获取到锁的时候其他的进程就必须要等待锁释放才可以进行争抢,在这个例子里面就可以加上一把锁来保护数据安全.
from multiprocessing import Process, Lock import json,time,random   def show_tickets(name):     time.sleep(random.randint(1,3))     with open('ticket.json', 'rt', encoding='utf-8') as f:         data = json.load(f)         print('%s 查看 剩余票数: %s' % (name, data['count']))  def buy_ticket(name):     time.sleep(random.randint(1,3))     with open('ticket.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('ticket.json', 'wt', encoding='utf-8') as f:                 json.dump(dic, f)                 print('%s: 购票成功' % name)  def task(name,lock):     show_tickets(name)     lock.acquire()     buy_ticket(name)     lock.release()  if __name__ == '__main__':     mutex = Lock()     for i in range(1,11):         p = Process(target=task, args=(i,mutex))         p.start()运行结果:

这样加了锁(互斥锁)就可以解决同时操作同一个文件造成的数据混乱问题了.
当使用多进程开发时,如果多个进程同时读写同一个资源,可能会造成数据的混乱,为了防止发生问题,使用锁,或者使用 Process 的方法 join 将并行变为串行.
                    50000+
                    
            5万行代码练就真实本领
                
                    17年
                    
            创办于2008年老牌培训机构
                
                    1000+
                    
            合作企业
                
                    98%
                    
            就业率
                