python並發編程之多進程(實現)
阿新 • • 發佈:2018-02-04
打印 spa art gpo 多核 也會 如果 屬性 設置
一、multipricessing模塊的介紹
python中的多線程無法利用多核優勢,如果想要充分的使用多核CPU資源,在python中大部分情況下需要用多線程,python提供了multiprocessing模塊
multiprocessing模塊用來開啟子進程,並在子進程中執行我們的任務(比如函數),該模塊與多線程模塊threading類的編程接口類似。
multiprocessing模塊的功能眾多:支持子進程、通信和共享數據,執行不同形式的同步,提供了Process類,Queue類,Pipe類,Lock類等組件
二、Process模塊的介紹
基本格式:
1 frommultiprocessing 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是否還在運行,在運行返回True
p.join() 如果加上此方法,那麽主線程將等著此線程運行完畢之後才會運行
屬性介紹:
p.daemon 默認值為False,如果設置為True,則代表後臺運行的守護進程,當p的父進程終止時,p也會隨之終止
p.name 進程名
p.pid 進程的pid
三、守護進程
主進程創建守護進程 其一:守護進程會在主進程代碼執行結束後就終止 其二:守護進程內無法再開啟子進程,否則拋出異常:AssertionError: daemonic processes are not allowed to have children 註意:進程之間是互相獨立的,主進程代碼運行結束,守護進程隨即終止 設置守護進程的方法: p.daemon = True p.daemon 默認值為False,如果設置為True,則代表後臺運行的守護進程,當p的父進程終止時,p也會隨之終止
五、進程同步(鎖)
進程之間數據不共享,但是共享同一套文件系統,所以訪問同一個文件,或同一個打印終端,是沒有問題的,
而共享帶來的是競爭,競爭帶來的結果就是錯亂,如何控制,就是加鎖處理
加鎖方式:
1、導入Lock類
2、實例化一個鎖 lock = Lock()
3、將lock作為參數傳給子進程函數
4、函數在需要枷鎖的代碼前加上lock.acquire()方法,在需要釋放鎖的地方加上lock.release()方法
六、隊列
進程彼此之間互相隔離,要實現進程間通信(IPC),multiprocessing模塊支持兩種形式:隊列和管道,這兩種方式都是使用消息傳遞的
from multiprocessing import Queue q = Queue(3) #限制最多放3個 如果超過3個則會堵塞,需要等待拿出去1個之後才能繼續放 q.put(1) #放數據(可以放任何數據類型) q.put(2) #放數據(可以放任何數據類型) q.put(3) #放數據(可以放任何數據類型) print(q.get()) #拿數據 print(q.get()) #拿數據 print(q.get()) #拿數據
python並發編程之多進程(實現)