进程关于数据共享
'''
进程可以实现数据共享,但现实中十分不常用!
实现数据共享会发生问题
什么情况下会发生?———— multiprocessing模块的 Manager类当中对字典/列表进行如下操作:+=、-=、*=、/=操作,其他操作不影响!!
如何解决?———— 加锁,但是程序变成同步的了!!!!!
'''
'''
进程之间数据交互问题:
# 进程的IPC:队列、管道
还有涉及到的有multiprocessing模块的Manager类、Lock(子进程之间怎么知道有锁,因此底层会有交互的机制)、Process类(底层也会有交的机制)
'''
进程之间的数据安全问题
1、数据共享:
(1) 进程之间数据不共享----是隔离的
# -*- coding:utf-8 -*- from multiprocessing import Process def func(dic): dic['count'] -= 1 if __name__ == '__main__': dic = {'count':100} p_lis = [] for i in range(20): p = Process(target=func,args=(dic,)) p_lis.append(p) p.start() for i in p_lis: i.join() print(dic) #{'count': 100}
(2-1) # -*- coding:utf-8 -*- from multiprocessing import Process,Manager def func(dic): dic['count'] -= 1 if __name__ == '__main__': m = Manager() dic = m.dict({'count': 100}) p_lis = [] for i in range(100): p = Process(target=func,args=(dic,)) p_lis.append(p) p.start() for i in p_lis: i.join() print(dic) #{'count': 1}
### 100 为什么减100次1这么慢?不是减操作造成的,而是开启、执行、销毁进程的过程拖慢了程序的执行效率 ### 为什么出现了数据不安全的现象(得到2 或者1等其他数据)?所有子进程同时操作共同的数据,两个进程可能同时改一次数据
(2-2)加锁解决 ———— 但变成同步的程序了
# -*- coding:utf-8 -*- from multiprocessing import Process,Manager,Lock def func(dic,lock): with lock: dic['count'] -= 1 if __name__ == '__main__': lock = Lock() m = Manager() dic = m.dict({'count': 100}) p_lis = [] for i in range(100): p = Process(target=func,args=(dic,lock)) p_lis.append(p) p.start() for i in p_lis: i.join() print(dic) #{'count': 0}