python 進程間通信(下)


利用 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 高


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM