1. 程式人生 > 實用技巧 >Python程序間通訊

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)可能要擴充套件到多機分佈的用程序,多核分佈的用執行緒


參考連結