Python 进程间的数据共享

1.在使用并发设计的时候最好尽可能的避免共享数据,尤其是在使用多进程的时候。 如果你真有需要 要共享数据, multiprocessing提供了两种方式。

 一种是,数据可以用Value或Array存储在一个共享内存地图里,如下:

from multiprocessing import Process,Value,Array,RLock

def func(v,a):
    v.value = 1.2345678
    for i in range(len(a)):
        a[i] *=2


if __name__ == '__main__':
    v = Value('d',0.0)
    a = Array('i',range(10))
    p1 = Process(target=func,args=(v,a))
    p2 = Process(target=func, args=(v, a))
    p1.start()
    p1.join()
    p2.start()
    p2.join()
    print(v.value)
    print(a[:])
typecode_or_type 对应如下
‘c’: ctypes.c_char     ‘u’: ctypes.c_wchar    ‘b’: ctypes.c_byte     ‘B’: ctypes.c_ubyte
‘h’: ctypes.c_short     ‘H’: ctypes.c_ushort    ‘i’: ctypes.c_int      ‘I’: ctypes.c_uint
‘l’: ctypes.c_long,    ‘L’: ctypes.c_ulong    ‘f’: ctypes.c_float    ‘d’: ctypes.c_double

2.第二种,由Manager()返回的manager提供list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array类型的支持。

from multiprocessing import Process,Manager

def func(l,d):
    l.append(1)
    l.append(2)
    d['a']='123'
    d['b']='456'

if __name__ == '__main__':
    with Manager() as manager:
        l = manager.list()
        d = manager.dict()
        p = Process(target=func,args=(l,d))
        p.start()
        p.join()
        print(l)
        print(d)

 

posted @ 2017-05-07 23:50  1916  阅读(800)  评论(0)    收藏  举报