1. 程式人生 > >multiprocessing 程序物件屬性,建立自己的程序類,程序池技術,程序間通訊

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  要存入共享記憶體的資料
               列表  將列表存入共享記憶體,資料型別       一致
        正整數  表示開闢幾個資料空間


           管道          訊息佇列       共享記憶體

開闢空間   記憶體          記憶體           記憶體

讀寫方式   兩端讀寫      先進先出    操作覆蓋記憶體
           雙向/單向

效率       一般          一般           較快

應用      多用於兩端     使用廣泛     複雜,需要  通訊       同步互斥機制