進程:
進程是一個獨立的資源管理單元,不同進程間的資源是獨立的,不能在一個進程中訪問另一個進程的用戶空間和內存空間。但是,進程不是孤立的,不同進程之間需要信息的交互和狀態的傳遞,因此需要進程間數據的傳遞、同步和異步的機制。
當然,這些機制不能由哪一個進程進行直接管理,只能由操作系統來完成其管理和維護,Linux提供了大量的進程間通信機制,包括同一個主機下的不同進程和網絡主機間的進程通信
同一主機間的信息交互:
- 無名管道:
特點:多用於親緣關係進程間通信,方向爲單向;爲阻塞讀寫;通信進程雙方退出後自動消失
問題:多進程用同一管道通信容易造成交叉讀寫問題 - 有名管道:
FIFO,方向爲單向(雙向需要兩個FIFO),以磁盤文件的方式存在;通信雙方一方不存在則阻塞 - 消息隊列:
可用於同一主機任意多進程的通信,但其可存放的數據有限,應用於少量的數據傳遞 - 共享內存:
可實現通一主機任意進程間大量數據的通信,但多進程對共享內存的訪問存在着競爭 - 文件:
文件是進程安全的
同一主機進程間的同步機制:信號量
同一主機進程間的異步機制:信號
多進程共享內存:
最簡單的就是文件,文件時進程安全的
若數據量不時很大,可以用python自帶的Queue,Pipe等
若數儘量很大的話,使用中間媒介,如:數據庫,redis
網絡主機間數據交互:
- Socket套接字
1. 共享內存的概念:
共享內存,主要是實現進程間大量數據的傳輸。所謂共享內存,即在內存中開闢一段特殊的內存空間,多個進程可互斥訪問,該內存空間具有自身特有的數據結構。
- 多個進程在使用此共享內存空間時候,必須在進程地址空間與共享內存地址空間之間建立連接,即將共享內存空間掛載到進程中;
- 共享內存是由一個進程開闢,其它任何進程都可以掛載;
- 共享內存並不會隨着進程的退出而消失,因此最後不使用此內存空間時,必須要手動刪除。
2. python中共享內存模塊:
python的multiprocessing模塊也給我們提供了共享內存的操作
一般的變量在進程之間是沒法進行通訊的,multiprocessing 給我們提供了 Value 和 Array 模塊,他們可以在不通的進程中共同使用
假如用Process了幾個子進程:
- 子進程繼承父進程的全局變量,而且是以複製的形式完成(進程數大容易內存溢出),所以子進程修改後的全局變量只對自己和自己的子進程有影響。
- 父子進程不共享這些全局變量,也就是說:父進程中對全局變量的修改不影響子進程中的全局變量,同理,子進程也不影響父進程的。
爲了實現父子進程的通信:value和array方法
- Value函數返回一個 shared memory 包裝類,其中包含一個 ctypes 對象,一般 整數用 i ,字符用 c ,浮點數用 d 就可以了
- Array函數返回一個 shared memory 包裝類,其中包含一個數組,字符串需要用 Array 來傳遞。
創建一個 lock 來控制對 value 的訪問,該參數可以是 Lock 也可以是 RLock 對象。