python 多進程之間內存共享

進程:
進程是一個獨立的資源管理單元,不同進程間的資源是獨立的,不能在一個進程中訪問另一個進程的用戶空間和內存空間。但是,進程不是孤立的,不同進程之間需要信息的交互和狀態的傳遞,因此需要進程間數據的傳遞、同步和異步的機制。

當然,這些機制不能由哪一個進程進行直接管理,只能由操作系統來完成其管理和維護,Linux提供了大量的進程間通信機制,包括同一個主機下的不同進程和網絡主機間的進程通信

同一主機間的信息交互:

  • 無名管道
    特點:多用於親緣關係進程間通信,方向爲單向;爲阻塞讀寫;通信進程雙方退出後自動消失
    問題:多進程用同一管道通信容易造成交叉讀寫問題
  • 有名管道
    FIFO,方向爲單向(雙向需要兩個FIFO),以磁盤文件的方式存在;通信雙方一方不存在則阻塞
  • 消息隊列
    可用於同一主機任意多進程的通信,但其可存放的數據有限,應用於少量的數據傳遞
  • 共享內存
    可實現通一主機任意進程間大量數據的通信,但多進程對共享內存的訪問存在着競爭
  • 文件
    文件是進程安全的

同一主機進程間的同步機制:信號量
同一主機進程間的異步機制:信號

多進程共享內存:
最簡單的就是文件,文件時進程安全的
若數據量不時很大,可以用python自帶的Queue,Pipe等
若數儘量很大的話,使用中間媒介,如:數據庫,redis

網絡主機間數據交互:

  • Socket套接字

1. 共享內存的概念:
共享內存,主要是實現進程間大量數據的傳輸。所謂共享內存,即在內存中開闢一段特殊的內存空間,多個進程可互斥訪問,該內存空間具有自身特有的數據結構。

  • 多個進程在使用此共享內存空間時候,必須在進程地址空間與共享內存地址空間之間建立連接,即將共享內存空間掛載到進程中;
  • 共享內存是由一個進程開闢,其它任何進程都可以掛載;
  • 共享內存並不會隨着進程的退出而消失,因此最後不使用此內存空間時,必須要手動刪除。

2. python中共享內存模塊:
python的multiprocessing模塊也給我們提供了共享內存的操作

一般的變量在進程之間是沒法進行通訊的,multiprocessing 給我們提供了 ValueArray 模塊,他們可以在不通的進程中共同使用

假如用Process了幾個子進程:

  1. 子進程繼承父進程的全局變量,而且是以複製的形式完成(進程數大容易內存溢出),所以子進程修改後的全局變量只對自己和自己的子進程有影響。
  2. 父子進程不共享這些全局變量,也就是說:父進程中對全局變量的修改不影響子進程中的全局變量,同理,子進程也不影響父進程的。

爲了實現父子進程的通信:value和array方法

  1. Value函數返回一個 shared memory 包裝類,其中包含一個 ctypes 對象,一般 整數用 i ,字符用 c ,浮點數用 d 就可以了
  2. Array函數返回一個 shared memory 包裝類,其中包含一個數組,字符串需要用 Array 來傳遞。
    創建一個 lock 來控制對 value 的訪問,該參數可以是 Lock 也可以是 RLock 對象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章