multiprocessing類似於threading模塊支持生成進程的包,是Python的標準模塊,它既可以用來編寫多進程,也可以用來編寫多線程。如果是多線程的話,用multiprocessing.dummy即可,用法與multiprocessing基本相同。由於python使用全局解釋器鎖(GIL),他會將進程中的線程序列化,也就是多核cpu實際上並不能達到並行提高速度的目的,而使用多進程則是不受限的,所以實際應用中都是推薦多進程的。
如果每個子進程執行需要消耗的時間非常短(執行+1操作等),這不必使用多進程,因爲進程的啓動關閉也會耗費資源。當然使用多進程往往是用來處理CPU密集型(科學計算)的需求,如果是IO密集型(文件讀取,爬蟲等)則可以使用多線程去處理。
multiprocessing常用組件及功能
1.1、管理進程模塊:
- Process(用於創建進程模塊)
- Pool(用於創建管理進程池)
- Queue(用於進程通信,資源共享)
- Value,Array(用於進程通信,資源共享)
- Pipe(用於管道通信)
- Manager(用於資源共享)
1.2、同步子進程模塊:
- Condition
- Event
- Lock
- RLock
- Semaphore
Process 類
class multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
- Process模塊用來創建子進程,是Multiprocessing核心模塊,使用方式與Threading類似,可以實現多進程的創建,啓動,關閉等操作。
- 一般需要傳入target目標函數,args函數的參數
2.1、run()
表示進程運行的方法。可以在子類中重寫此方法。標準run() 方法調用傳遞給對象構造函數的可調用對象作爲目標參數(如果有),分別使用args和kwargs參數中的順序和關鍵字參數。
2.2、start()
進程準備就緒,等待CPU調度。
2.3、join([ 超時] )
如果可選參數timeout是None,則該方法將阻塞,直到join()調用其方法的進程終止。如果timeout是一個正數,它最多會阻塞超時秒。請注意,None如果方法的進程終止或方法超時,則返回該方法。檢查進程exitcode以確定它是否終止。
2.4、name
進程的名稱。該名稱是一個字符串,僅用於識別目的。
2.5、is_alive()
返回進程是否存活。從start() 方法返回到子進程終止的那一刻,進程對象仍處於活動狀態。
2.6、daemon
進程的守護進程標誌,一個布爾值。必須在start()調用之前設置,當進程退出時,它會嘗試終止其所有守護進程子進程。
2.7、pid
返回進程ID。在產生該過程之前,這將是 None。
2.8、exitcode
子進程的退出代碼。None如果流程尚未終止,這將是。負值-N表示孩子被信號N終止。
需要注意的是start(),join(),is_alive(), terminate()和exitcode方法只能由創建進程對象的過程調用。
一些方法的示例用法Process:
from multiprocessing import Process
import time
import os
def info():
print('module name:', __name__)
print('parent process:', os.getppid())
print('process id:', os.getpid())
def f(name):
info()
time.sleep(3)
print('hello', name)
if __name__ == '__main__':
info()
p = Process(target=f, args=('bob',))
# p.daemon = False
print(p.daemon)
p.start()
p.join(1)
print('name:', p.name)
print('is_alive:', p.is_alive())
print('exitcode:', p.exitcode)
'''
------------------------------------------------------------
module name: __main__
parent process: 1188
process id: 13060
False
module name: __mp_main__
parent process: 13060
process id: 13424
name: Process-1
is_alive: True
exitcode: None
hello bob
------------------------------------------------------------
'''
在上述邏輯中,子進程會休息3s然後再打印一句話才結束,同時設定join(1)阻塞1s,阻塞在1s後結束,我們的並沒有守護主進程,然後主進程結束後,子進程依然alive;
如果想要守護主進程,設定p.daemon = True:
if __name__ == '__main__':
info()
p = Process(target=f, args=('bob',))
p.daemon = True
print(p.daemon)
p.start()
# p.join(1)
print('name:', p.name)
print('is_alive:', p.is_alive())
print('exitcode:', p.exitcode)
'''
------------------------------------------------------------
module name: __main__
parent process: 1188
process id: 1668
True
name: Process-1
is_alive: True
exitcode: None
------------------------------------------------------------
'''