【python】詳解multiprocessing多進程-process模塊(一)

       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
------------------------------------------------------------
'''
       在上述邏輯中,子進程會休息3s然後再打印一句話才結束,我們的設定守護主進程,然後主進程結束後,打印的is_alive: True這句話其實是在主進程裏運行的,所以此時子進程確實是alive,但是主進程結束後子進程也結束了,不會運行info() 函數;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章