python3 进程锁
- 2020 年 1 月 13 日
- 笔记
多进程抢占资源 当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题。
import os import time import random from multiprocessing import Process,Lock def work(n): print('%s: %s is runing' % (n,os.getpid())) time.sleep(random.random()) print('%s: %s is down' % (n, os.getpid())) if __name__ == '__main__': for i in range(3): # 利用for循环模拟多进程 p=Process(target=work,args=(i,)) p.start() 输出结果: 0: 10974 is runing 1: 10975 is runing 2: 10976 is runing 1: 10975 is down 2: 10976 is down 0: 10974 is down
加锁
# 由并发变成了串行,牺牲了运行效率,但避免了竞争 import os import time import random from multiprocessing import Process,Lock def work(lock,n): lock.acquire() print('%s: %s is runing' % (n,os.getpid())) time.sleep(random.random()) print('%s: %s is down' % (n, os.getpid())) lock.release() if __name__ == '__main__': lock = Lock() for i in range(3): p=Process(target=work,args=(lock,i)) p.start() 输出结果: 0: 10986 is runing 0: 10986 is down 1: 10987 is runing 1: 10987 is down 2: 10988 is runing 2: 10988 is down
上面这种情况虽然使用加锁的形式实现了顺序的执行,但是程序又重新变成串行了,这样确实会浪费了时间,却保证了数据的安全。这个过程类似于数据库的事务
例子:模拟抢票
没有加锁的情况,虽然实现了并发,但是数据不安全,本来只有一张票,但是还是会有多个人抢到,这显然不符合现实
# 文件db的内容为:{"count":1} # 注意一定要用双引号,不然json无法识别 # 并发运行,效率高,但竞争写同一文件,数据写入错乱 from multiprocessing import Process import time,json,random def search(): dic = json.load(open('db')) print('