標籤:資料 star def 預設值 nic 圖片 name 指定 自訂
一、multipricessing模組的介紹
python中的多線程無法利用多核優勢,如果想要充分的使用多核CPU資源,在python中大部分情況下需要用多線程,python提供了multiprocessing模組
multiprocessing模組用來開啟子進程,並在子進程中執行我們的任務(比如函數),該模組與多線程模組threading類的編程介面類似。
multiprocessing模組的功能眾多:支援子進程、通訊和共用資料,執行不同形式的同步,提供了Process類,Queue類,Pipe類,Lock類等組件
二、Process模組的介紹
基本格式:
1 from multiprocessing import Process #匯入模組2 3 def func(x): #定義一個函數(等待開一個新線程執行的函數)4 print(x)5 6 if __name__ == ‘__main__‘: #windows下一定要加上這句話才能運行7 p = Process(target=func,args=(‘傳參‘,)) #執行個體化一個進程,將函數名作為參數傳遞,將需要傳給函數的參數(元組形式)傳遞8 p.start() #(通知作業系統)開啟此進程
通過類的方式調用:
from multiprocessing import Process #調用模組class MyProcess(Process): #定義一個類,必須要繼承Process類 def __init__(self,name): #如果需要參數,一定要有init方法 super().__init__() #如果有init方法,一定要調用父類的init方法 self.name = name def run(self): #一定要實現一個run方法來重寫父類的run print(‘子進程%s已開啟‘%self.name)if __name__ == ‘__main__‘: p = MyProcess(‘aaa‘) #執行個體化一個自訂類的對象 p.start() #開啟進行
參數介紹:
target表示調用對象,既子進程要執行的任務args表示調用對象的位置參數元組,如:args=(1,)或者args=(1,2)kwargs表示調用對象的字典,如:kwargs={‘name‘:‘fuyong‘}
方法介紹:
p.start() 啟動進程,並且調用該子進程的run()方法p.run() 進程啟動時啟動並執行方法,正式它去調用target指定的函數,我們自訂類的話一定要實現該方法P.terminate()強制終止程式p,不會進行任何清理操作,如果p建立了子進程,那麼該子進程就成了‘殭屍進程 使用此方法時要特別小心,如果p還保留了一個鎖,那麼鎖也不會被釋放,進而導致了死結p.is_alive() 判斷p是否還在運行,在運行返回Truep.join() 如果加上此方法,那麼主線程將等著此線程運行完畢之後才會運行
屬性介紹:
p.daemon 預設值為False,如果設定為True,則代表後台啟動並執行守護進程,當p的父進程終止時,p也會隨之終止p.name 進程名p.pid 進程的pid
三、守護進程
主進程建立守護進程 其一:守護進程會在主進程代碼執行結束後就終止 其二:守護進程內無法再開啟子進程,否則拋出異常:AssertionError: daemonic processes are not allowed to have children注意:進程之間是互相獨立的,主進程代碼運行結束,守護進程隨即終止設定守護進程的方法:p.daemon = Truep.daemon 預設值為False,如果設定為True,則代表後台啟動並執行守護進程,當p的父進程終止時,p也會隨之終止
五、進程同步(鎖)
進程之間資料不共用,但是共用同一套檔案系統,所以訪問同一個檔案,或同一個列印終端,是沒有問題的,
而共用帶來的是競爭,競爭帶來的結果就是錯亂,如何控制,就是加鎖處理
加鎖方式:
1、匯入Lock類
2、執行個體化一個鎖 lock = Lock()
3、將lock作為參數傳給子進程函數
4、函數在需要枷鎖的代碼前加上lock.acquire()方法,在需要釋放鎖的地方加上lock.release()方法
六、隊列
進程彼此之間互相隔離,要實現處理序間通訊(IPC),multiprocessing模組支援兩種形式:隊列和管道,這兩種方式都是使用訊息傳遞的
from multiprocessing import Queueq = Queue(3) #限制最多放3個 如果超過3個則會堵塞,需要等待拿出去1個之後才能繼續放q.put(1) #放資料(可以放任何資料類型)q.put(2) #放資料(可以放任何資料類型)q.put(3) #放資料(可以放任何資料類型)print(q.get()) #拿資料print(q.get()) #拿資料print(q.get()) #拿資料
python並發編程中的多進程(代碼實現)