1. Code
# -*- coding: utf-8 -*- """ 多進程 數據共享 共享變量 Value,Array 邏輯: 2個進程,對同一份數據,一個做加法,一個做加法,各做10次
總結:
1、入口代碼 必須放在 if __name__ == '__main__' 下,不然報錯,不清楚為什么
用法: 1. 創建共享變量 o = Value('i',1000) or o = Array('i',list) 指定不同的類型 2. 啟動子進程通過 o.value or o[i] 存取變量的值 3. 必要使用鎖操作函數 o.acquire() o.release() 參考: get_lock() 返回共享變量使用的Rlock 實例 get_obj() 返回共享變量數據類型 """ from multiprocessing import Process,Value,Array import time import random # 對共享變量加法 def save_money(money): money.acquire() # 申請鎖 for i in range(10): time.sleep(0.3) change = random.randint(1,200) money.value += change print "\n ",money.value,change money.release() # 釋放鎖 # 對共享變量減法 def take_money(money): money.acquire() for i in range(10): time.sleep(0.5) change = random.randint(1,150) money.value -= change print "\n ",money.value," ",-change money.release() # 修改共享變量數組 def save_money2(): m.acquire() # 申請鎖 m[2] = 8 print [ i for i in m ] m.release() # 釋放鎖 # 讀取共享變量數組 def take_money2(): m.acquire() # 申請鎖 print [ i for i in m ] m.release() # 釋放鎖 if True: m = Array('i',[1,2,3,4,5]) # 放在main下面,就不是全局了 if __name__ == '__main__': # 共享內存,可以多個進程存取,整型,變量名money,變量值1000 money = Value('i',1000) d = Process(target=save_money, args=(money,)) d.start() w = Process(target=take_money, args=(money,)) w.start() d.join() w.join() Process(target=save_money2).start() Process(target=take_money2).start() print "end"
Out:

995 -5 892 -103 814 -78 694 -120 668 -26 550 -118 482 -68 423 -59 293 -130 188 -105 193 5 325 132 473 148 535 62 539 4 677 138 738 61 875 137 1066 191 1231 165 end [1, 2, 8, 4, 5] [1, 2, 3, 4, 5]
2 資料
https://www.cnblogs.com/gengyi/p/8661235.html
基本特點:
(1)共享內存是一種最為高效的進程間通信方式,進程可以直接讀寫內存,而不需要任何數據的拷貝。
(2)為了在多個進程間交換信息,內核專門留出了一塊內存區,可以由需要訪問的進程將其映射到自己的私有地址空間。進程就可以直接讀寫這一塊內存而不需要進行數據的拷貝,從而大大提高效率。(文件映射)
(3)由於多個進程共享一段內存,因此也需要依靠某種同步機制。
優缺點:
優點:快速在進程間傳遞數據
缺點: 數據安全上存在風險,內存中的內容會被其他進程覆蓋或 者篡改
注: 經常和同步互斥配合使用
Value:將一個值存放在內存中,
Array:將多個數據存放在內存中,但要求數據類型一致
Value
注: Value('h',1) = Value(c_short,1)
Array
Array(typecode_or_type, size_or_initializer, *, lock=True)
使用基本類似於Value,Returns a synchronized shared array
typecode_or_type:定義轉換成C語言的存儲類型;
size_or_initializer:如果它是一個整數,那么它確定數組的長度,並且數組將被初始化為零。否則,size_or_initializer是用於初始化數組的序列,其長度決定數組的長度
lock : lock為True,則會創建一個新的鎖對象,以同步對該值的訪問。如果lock是Lock或RLock對象,那么它將用於同步對該值的訪問。如果lock是False,那么對返回的對象的訪問不會被鎖自動保護,因此它不一定是“進程安全的”