利用 Value,Array 先說明這個方法並不常用,因為有更靈活的方法
from multiprocessing import Process,Value,Array def f(n,a,not_share): n.value=3.141 for i in range(len(a)): a[i]=-a[i]
#更改共享內存 not_share.append(999) print 'not_share:',not_share if __name__ == '__main__': #這個是一個普通的列表 not_share=[1000] #這個是導入的方法,可以進程共享內存的,’d‘代表數字並不是隨便寫的。后面的值也必須是數字 num=Value('d',123) #這里的’i‘代表列表,不是隨便寫的。利用這個方法可以進程間共享 arr = Array('i',range(10)) #啟動子進程 p=Process(target=f,args=(num,arr,not_share)) p.start() p.join() #可以通過這里的輸出看出子進程將這個變量的值改了,注意 num.value,和正常的變量有所不同 print num.value #這里和以前打印列表的方式也不一樣,方法都被改造了所以才能實現進程間的共享 print arr[:] #這里打印普通的列表,發現進程間無法更改內存 print 'not_share:',not_share
顯示內容:
not_share: [1000, 999] 子進程里面修改成功,但是看下面父進程返回的值。並沒有修改
3.141 共享內存已經被修改了
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9] 共享內存已經被修改了
not_share: [1000] 父進程打印的列表,子進程並沒有修改內存成功
利用 manager方法:
可以支持的數據類型很多,列表、字典、鎖、變量、信號、隊列等。
1 #_*_coding:utf-8_*_ 2 from multiprocessing import Process,Manager 3 4 def f(d,l): 5 d[1]='1' 6 d['2']=2 7 #將列表內容反轉 8 l.reverse() 9 10 11 if __name__ == '__main__': 12 #先定義一下 13 manager=Manager() 14 #利用manager方法生成一個空字典 15 d=manager.dict() 16 #利用manager方法生成一個列表 17 l=manager.list(range(10)) 18 19 p=Process(target=f,args=(d,l)) 20 p.start() 21 p.join() 22 23 print d 24 print l
顯示內容:
{1: '1', '2': 2}
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
父進程中定義的字典和列表內容全部被子進程更改掉了
結論:
父進程和子進程內存中肯定是獨立的,它們之間的修改就是借助第三方橋梁完成。並不是正真意義上的共享,manager是自帶進程鎖,在進行修改的時候不必擔心多進程同時進行修改的問題。線程才是真正意義上的共享一個內存區域,但
線程不自帶鎖必須自己加鎖。
manager比較靈活可以實現不同主機間的進程共享(聽着好像很牛逼),但是效率沒有Value,Array 高