锁——multiprocessing.Lock
什么是锁?
当多个进程使用同一份数据资源的时候,会引发数据安全或顺序混乱问题。这个时候我们希望进程可以一个一个的去获取和修改数据,将几个并发的进程编程串行,这样就可以保证数据的安全。我们可以引用Lock模块来帮我们来实现将异步执行的程序在加锁的代码段中同步去执行。

mport os import time import random from multiprocessing import Process def work(n): print('%s: %s is running' %(n,os.getpid())) time.sleep(random.random()) print('%s:%s is done' %(n,os.getpid())) if __name__ == '__main__': for i in range(3): p=Process(target=work,args=(i,)) p.start()

# 由并发变成了串行,牺牲了运行效率,但避免了竞争 import os import time import random from multiprocessing import Process,Lock def work(lock,n): lock.acquire() print('%s: %s is running' % (n, os.getpid())) time.sleep(random.random()) print('%s: %s is done' % (n, os.getpid())) lock.release() if __name__ == '__main__': lock=Lock() for i in range(3): p=Process(target=work,args=(lock,i)) p.start() 使用锁维护执行顺序
上面这种情况虽然使用加锁的形式来实现了顺序的执行, 但是程序由并发编程串行了。这样虽然降低了效率,却保证了数据的安全。
模拟抢票,来看看数据安全的重要性。

#文件db的内容为:{"count":1} #注意一定要用双引号,不然json无法识别 #并发运行,效率高,但竞争写同一文件,数据写入错乱 from multiprocessing import Process,Lock import time,json,random def search(): dic=json.load(open('db')) print('