multiprocessing 程序物件屬性,建立自己的程序類,程序池技術,程序間通訊
通常使用multiprocessing建立程序,父程序只用作程序的建立和回收,不做其他工作。
multiprocessing 程序物件屬性
p.start() 啟動程序
p.join() 回收程序
p.is_alive() 判斷程序生命週期狀態 返回True False
p.name 程序名稱 預設為Process-1 如果起名字則為自 定義名稱
p.pid 建立的程序的PID
p.daemon
預設值為False 父程序退出不會影響子程序執行
如果設定為True 則父程序退出子程序也會退出
* daemon的設定必須在start前
* 如果設定daemon為True 則不再使用join
建立自己的程序類
1. 繼承Process類
2. 重寫__init__ 並且呼叫父類的__init__
3. 重寫run方法,此時生成物件後 呼叫start就會自動運 行run
多程序
優點 : 能並行執行多個任務,提高效率
建立方便,執行獨立,不受其他程序影響
資料安全
缺點 : 程序的建立和刪除都需要消耗計算機的資源
程序池技術
產生原因 : 如果有大量任務需要多程序完成,且可能需要頻繁的建立和刪除程序,給計算機帶來大量的資源消耗。
原理 : 在程序池內執行一定數量程序,通過這些程序完成程序池佇列中的事件,直到事件執行完畢,減少程序不斷的建立刪除過程。
實施操作方法:
1. 建立程序池,在程序池中放入適當程序
2. 將事件加入到程序池佇列
3. 事件不斷執行,直到所有事件執行完畢
4. 關閉程序池,回收程序
from multiprocessing import Pool
pool = Pool(processes)
功能 : 建立程序池物件
引數 : 表示程序池中有多少程序
pool.apply_async(func,args,kwds)
功能 : 將事件放入程序池佇列
引數 : func 要執行的事件
args 給func用元組傳參
kwds 給func用字典傳參
返回值 : 返回事件物件 通過get()方法獲取事件函式返 回值
pool.apply(func,args,kwds)
功能 : 將事件放入程序池佇列
引數 : func 要執行的事件
args 給func用元組傳參
kwds 給func用字典傳參
pool.close()
功能 : 關閉程序池,不能再新增新的事件
pool.join()
功能 : 阻塞等待回收程序池
pool.map(func,iter)
功能 : 將要完成的事件放入程序池
引數 : func 要完成的事件函式
iter 可迭代物件給func傳參
返回值 : 事件函式的返回值列表
cookie
獲取檔案大小
os.path.getsize(path)
功能 : 獲取一個檔案的大小
引數 : 檔案
程序間通訊
程序間由於空間獨立,資源無法互相直接獲取,此時在不同的程序間進行資料傳遞就需要專門的通訊方法
程序間通訊方法(IPC)
管道 訊息佇列 共享記憶體 訊號 訊號量 套接字
管道通訊 Pipe
管道 : 在記憶體中開闢一段空間,形成管道結構,管道對多個程序可見,程序可以對管道進行讀寫操作
multiprocess ---》 Pipe
fd1,fd2 = Pipe(duplex = True)
功能 : 建立一個管道
引數 : 預設為雙向管道
如果設定為False 則為單向管道
返回值 :如果雙向管道,fd1 fd2都可以進行讀寫操作
如果是單向管道,則fd1 只可讀,fd2只可寫
fd.recv()
功能 : 從管道讀取內容
返回值 : 讀到的內容
* 如果管道無內容則阻塞
fd.send(data)
功能: 向管道寫入內容
引數: 要傳送的內容
* 幾乎可以傳送所有python支援的資料
訊息佇列
佇列 : 先進先出
在記憶體中開闢佇列結構空間,多個程序可以向佇列投放訊息,在取出的時候按照存入順序取出
建立佇列
q = Queue(maxsize = 0)
功能 : 建立佇列
引數 : maxsize 預設表示根據系統分配空間儲存訊息
如果傳入一個正整數則表示最多存放多少條訊息
返回 : 佇列物件
q.put(data,[block,timeout])
功能: 存放訊息
引數: data 存入的訊息 (python資料型別)
block 預設為True表示當佇列滿的時候阻塞
設定為False則表示非阻塞
timeout 當block為True表示超時時間
data = q.get([block,timeout])
功能 : 取出訊息
引數 : block 預設為True 當佇列空時阻塞
設定為False表示非阻塞
timeout 當block為True時表示超時時間
返回值 : 返回獲取的訊息
q.full() 判斷佇列是否為滿
q.empty() 判斷佇列是否為空
q.qsize() 判斷當前佇列有多少訊息
q.close() 關閉佇列
共享記憶體
在記憶體中開闢一段空間,儲存資料,對多個程序可見。每次寫入共享記憶體中的資料會覆蓋之前的內容
from multiprocessing import Value
obj = Value(ctype,obj)
功能 : 開闢共享記憶體空間
引數 : ctype 字串 要轉變的c的資料型別
對比型別對照表
obj 共享記憶體的初始化資料
返回 : 共享記憶體物件
obj.value 表示共享記憶體中的值。對其修改或者使用即 可
obj = Array(ctype,obj)
功能: 開闢共享記憶體
引數: ctype 要轉化的c的型別
obj 要存入共享記憶體的資料
列表 將列表存入共享記憶體,資料型別 一致
正整數 表示開闢幾個資料空間
管道 訊息佇列 共享記憶體
開闢空間 記憶體 記憶體 記憶體
讀寫方式 兩端讀寫 先進先出 操作覆蓋記憶體
雙向/單向
效率 一般 一般 較快
應用 多用於兩端 使用廣泛 複雜,需要 通訊 同步互斥機制