[b0035] python 歸納 (二十)_多進程數據共享和同步_共享內存Value & Array


  

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]
View Code

 

 

 

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,那么對返回的對象的訪問不會被鎖自動保護,因此它不一定是“進程安全的”

 


免責聲明!

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



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