Python程序間通訊
Python程序間通訊
程序間通訊(IPC)
1.必要性: 程序間空間獨立,資源不共享,此時在需要程序間資料傳輸時就需要特定的手段進行資料通訊。
2.常用程序間通訊方法:管道通訊、訊息佇列、共享記憶體、訊號量
管道通訊(Pipe)
1.通訊原理:在記憶體中開闢管道空間,生成管道操作物件,多個程序使用同一個管道物件進行讀寫即可實現通訊
2.實現方法
from multiprocessing import Pipe
fd1,fd2 = Pipe(duplex = True)
- 功能: 建立管道
- 引數:預設表示雙向管道
- 如果為False 表示單向管道
- 返回值:表示管道兩端的讀寫物件
- 如果是雙向管道均可讀寫
- 如果是單向管道fd1只讀 fd2只寫
fd.recv()
- 功能 : 從管道獲取內容
- 返回值:獲取到的資料
fd.send(data)
- 功能: 向管道寫入內容
- 引數: 要寫入的資料
管道通訊示例
訊息佇列
1.通訊原理:在記憶體中建立佇列模型,程序通過佇列將訊息存入,或者從佇列取出完成程序間通訊。
2.實現方法
from multiprocessing import Queue
q = Queue(maxsize=0)
- 功能: 建立佇列物件
- 引數:最多存放訊息個數
- 返回值:佇列物件
q.put(data,[block,timeout])
- 功能:向佇列存入訊息
- 引數:data 要存入的內容
- block 設定是否阻塞 False為非阻塞
- timeout 超時檢測
q.get([block,timeout])
- 功能:從佇列取出訊息
- 引數:block 設定是否阻塞 False為非阻塞
- timeout 超時檢測
- 返回值: 返回獲取到的內容
q.full() 判斷佇列是否為滿
q.empty() 判斷佇列是否為空
q.qsize() 獲取佇列中訊息個數
q.close() 關閉佇列
訊息佇列演示
共享記憶體
1.通訊原理:在內中開闢一塊空間,程序可以寫入內容和讀取內容完成通訊,但是每次寫入內容會覆蓋之前內容。
2.實現方法
from multiprocessing import Value,Array
obj = Value(ctype,data)
- 功能 : 開闢共享記憶體
- 引數 : ctype 表示共享記憶體空間型別 'i' 'f' 'c'
- data 共享記憶體空間初始資料
- 返回值:共享記憶體物件
obj.value
- 對該屬性的修改檢視即對共享記憶體讀寫
obj = Array(ctype,data)
- 功能: 開闢共享記憶體空間
- 引數: ctype 表示共享記憶體資料型別
- data 整數則表示開闢空間的大小,其他資料型別表示開闢空間存放的初始化資料
- 返回值:共享記憶體物件
Array共享記憶體讀寫: 通過遍歷obj可以得到每個值,直接可以通過索引序號修改任意值。
* 可以使用obj.value直接列印共享記憶體中的位元組串
value
array
多程序和多執行緒總結
1.什麼是程序?什麼是執行緒?
程序是表示資源分配的基本單位,又是排程執行的基本單位。
例如,使用者執行自己的程式,系統就建立一個程序,併為它分配資源,
包括各種表格、記憶體空間、磁碟空間、I/O裝置等。然後,把該程序放
人程序的就緒佇列。程序排程程式選中它,為它分配CPU以及其它有關資源,該程序才真正執行。
執行緒是程序中執行運算的最小單位,如果把程序理解為在邏輯上作業系統所完成的任務,
那麼執行緒表示完成該任務的許多可能的子任務之一。例如,假設使用者啟子任務;在產生
工資單報表的過程中,使用者又可以輸人資料庫查詢請求,這又是一個子任務。
多執行緒就像是火車上的每節車廂,而程序就是火車。
2.多程序和多執行緒的區別?
- 資料共享、同步:
1). 資料共享複雜,需要用IPC;資料是分開的,同步簡單
2). 因為共享程序資料,資料共享簡單,但也是因為這個原因導致同步複雜
各有優勢 - 記憶體、CPU
1). 佔用記憶體多,切換複雜,CPU利用率低
2). 佔用記憶體少,切換簡單,CPU利用率高
執行緒佔優 - 建立銷燬、切換
1). 建立銷燬、切換複雜,速度慢
2). 建立銷燬、切換簡單,速度很快
執行緒佔優 - 程式設計、除錯
1). 程式設計簡單,除錯簡單
2). 程式設計複雜,除錯複雜
程序佔優 - 可靠性
1). 程序間不會互相影響
2). 一個執行緒掛掉將導致整個程序掛掉
程序佔優 - 分散式
1). 適應於多核、多機分散式;如果一臺機器不夠,擴充套件到多臺機器比較簡單
2). 適應於多核分散式
程序佔優
3.程序之間的通訊方式以及優缺點?
管道, 訊號量, 訊號, 訊息佇列, 共享記憶體, 套接字
4.執行緒之間的通訊方式?
鎖機制:包括互斥鎖、條件變數、讀寫鎖
訊號量機制(Semaphore)
訊號機制(Signal)
5.什麼時候用多執行緒?什麼時候用多程序?
1)需要頻繁建立銷燬的優先用執行緒
2)需要進行大量計算的優先使用程序
3)可能要擴充套件到多機分佈的用程序,多核分佈的用執行緒