进程关于数据共享

'''
进程可以实现数据共享,但现实中十分不常用!
实现数据共享会发生问题
什么情况下会发生?———— 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}

 

posted on 2019-04-17 15:51  江湖乄夜雨  阅读(460)  评论(0编辑  收藏  举报