標籤:invalid 功能 讀寫 return shared 容量 直接 基本文法 dex
1 共用記憶體
基本特點:
(1)共用記憶體是一種最為高效的處理序間通訊方式,進程可以直接讀寫記憶體,而不需要任何資料的拷貝。
(2)為了在多個進程間交換資訊,核心專門留出了一塊記憶體區,可以由需要訪問的進程將其映射到自己的私人地址空間。進程就可以直接讀寫這一塊記憶體而不需要進行資料的拷貝,從而大大提高效率。(檔案對應)
(3)由於多個進程共用一段記憶體,因此也需要依靠某種同步機制。
優缺點:
優點:快速在進程間傳遞資料
缺點: 資料安全上存在風險,記憶體中的內容會被其他進程覆蓋或 者篡改
註: 經常和同步互斥配合使用
2 基本文法
共用記憶體要符合C語言的使用文法
from multiprocessing import Value , Array
Value:將一個值存放在記憶體中,
Array:將多個資料存放在記憶體中,但要求資料類型一致
補充:資料類型
Type code |
C Type |
Python Type |
Minimum size in bytes |
Notes |
‘b‘ |
signed char |
int |
1 |
|
‘B‘ |
unsigned char |
int |
1 |
|
‘u‘ |
Py_UNICODE |
Unicode character |
2 |
(1) |
‘h‘ |
signed short |
int |
2 |
|
‘H‘ |
unsigned short |
int |
2 |
|
‘i‘ |
signed int |
int |
2 |
|
‘I‘ |
unsigned int |
int |
2 |
|
‘l‘ |
signed long |
int |
4 |
|
‘L‘ |
unsigned long |
int |
4 |
|
‘q‘ |
signed long long |
int |
8 |
(2) |
‘Q‘ |
unsigned long long |
int |
8 |
(2) |
‘f‘ |
float |
float |
4 |
|
‘d‘ |
double |
float |
8 |
|
具體參考:8.7. array
— Efficient arrays of numeric values
2.1 Value
Value(typecode_or_type, *args, lock=True)
功能 : 得到一個共用記憶體對象,並且存入初始值,method of multiprocessing
返回Returns a synchronized shared object(同步共用對象)
typecode_or_type:定義了傳回型別(轉換成C語言中儲存類型),它要麼是一個ctypes類型,要麼是一個代表ctypes類型的code。
*args:開闢一個空間,並賦一個args值,值得類型不限
註:ctypes是python的一個外部函數庫,它提供了和C語言相容的資料類型,可以調用DLLs或共用庫的函數,能被用作在python中包裹這些庫。
from multiprocessing import Process,Valueimport timeimport randomdef save_money(money): for i in range(100): time.sleep(0.1) money.value += random.randint(1,200)def take_money(money): for i in range(100): time.sleep(0.1) money.value -= random.randint(1,150)# money為共用記憶體對象,給他一個初始值2000,類型為正型“i”# 相當於開闢了一個空間,同時綁定值2000,money = Value(‘i‘,2000)d = Process(target=save_money,args=(money,))#這裡面money是全域的,不寫也可d.start()w = Process(target=take_money,args=(money,))#這裡面money是全域的,不寫也可w.start()d.join()w.join()print(money.value)
運行 4491
2.2 Array
Array(typecode_or_type, size_or_initializer, *, lock=True)
使用基本類似於Value,Returns a synchronized shared array
typecode_or_type:定義轉換成C語言的儲存類型;
size_or_initializer:初始化共用記憶體空間,
若為數字,表示開闢的共用記憶體中的空間大小,(Value表示為該空間綁定一個數值)
若為數組,表示在共用記憶體中存入數組
from multiprocessing import Process,Arraydef fun(m,n): for i in range(n): print(m[i])# 此處不表數字8類型為整型‘i‘;# 表示開闢8個空間,且均為整型i,其實就是一個列表m = Array(‘i‘,3)p = Process(target= fun,args=(m,4))p.start()p.join()
運行
0 0 0Process Process-1:....IndexError: invalid index
說明:三個0表示開闢的共用記憶體容量為3,當再超過3時就會報錯。
樣本2
from multiprocessing import Process,Arrayimport timedef fun(m,n): for i in range(n): m[i]=im = Array(‘i‘,5)p = Process(target= fun,args=(m,5))p.start()time.sleep(1)for i in m: print(i)p.join()
運行結果
0 1 2 3 4
如果將 time.sleep(1) 去掉,則輸出結果均為0,原因就是還未賦值就已經列印了。
from multiprocessing import Process,Arrayimport timedef fun(m,n): for i in range(n): print(m[i]) m[i]=i# 此處表示開闢5個空間,同時存入列表中的元素m = Array(‘i‘,[1,2,3,4,5])p = Process(target= fun,args=(m,5))p.start()time.sleep(1)for i in m: print(i)p.join()
運行
1 2 3 4 50 1 2 3 4
第二個參數如果傳入一個數字,則表示在共用記憶體中開闢多大的空間,
如果傳入的是列表,則開闢響應元素數量的共用空間容量,並將其直接存入共用空間
python學習筆記——多進程中共用記憶體Value & Array