python學習筆記——多進程中共用記憶體Value & Array

來源:互聯網
上載者:User

標籤: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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.