Process實例有2個重要屬性:name和pid
Process實例的方法
#導入模塊 import multiprocessing import time #定義進程執行函數 def clock(interval): for i in range(5): print('當前時間爲{0}: '.format(time.ctime())) time.sleep(interval) if __name__=='__main__': #創建子進程 p=multiprocessing.Process(target=clock,args=(1,)) #啓動子進程 p.start() p.join() #獲取進程的 ID print('p.id:',p.pid) #獲取進程的名稱 print('p.name:',p.name) #判斷進程是否運行 print('p.is_alive:',p.is_alive())
創建多個進程
執行不同的任務
#導入模塊 import multiprocessing import time #創建進程調用函數 def work1(interval): print('執行work1') time.sleep(interval) print('end work1') def work2(interval): print('執行work2') time.sleep(interval) print('end work2') def work3(interval): print('執行work3') time.sleep(interval) print('end work3') if __name__=='__main__': print('執行主進程') #創建進程對象 p1=multiprocessing.Process(target=work1,args=(4,)) p2=multiprocessing.Process(target=work2,args=(3,)) p3=multiprocessing.Process(target=work3,args=(2,)) #啓動進程 p1.start() p2.start() p3.start() p1.join() p2.join() p3.join() print('主進程結束')
繼承process類創建進程
像Java一樣,也有2種方式創建進程
創建進程的方式還可以使用類的方式,可以自定義一個類,繼承 Process 類,重寫run方法,每次實例化這個類的時候,就等同於實例化一個進程對象
#導入模塊 from multiprocessing import Process import time #定義線程類 class ClockProcess(Process): def __init__(self,interval): Process.__init__(self) self.interval=interval def run(self): print('子進程開始執行的時間:{}'.format(time.ctime())) time.sleep(self.interval) print('子進程結束的時間:{}'.format(time.ctime())) if __name__=='__main__': #創建子進程 p=ClockProcess(2) #調用子進程 p.start() p.join() print('主進程結束')
進程池
在利用 Python 進行系統管理的時候,特別是同時操作多個文件目錄,或者遠程控制多臺主機,並行操作可以節約大量的時間。當被操作對象數目不大時,可以直接利用multiprocessing 中的 Process 動態成生多個進程,十幾個還好,但如果是上百個,上千個目標,手動的去限制進程數量卻又太過繁瑣,此時可以發揮進程池的功效。
Pool 可以提供指定數量的進程,供用戶調用,當有新的請求提交到 pool 中時,如果池還沒有滿,那麼就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到規定最大值,那麼該請求就會等待,直到池中有進程結束,纔會創建新的進程。
Pool(numprocess, initializer, initargs) 其中 numprocess 是要創建的進程數。如果省略此參數,將使用 cpu_count()的值。cpu是4核,就創建有4個進程的進程池,8核就創建8個進程的進程池
Initializer是每個工作進程啓動時要執行的可調用對象。 Initargs 是要傳遞給 initializer 的參數元祖。
Initializer 默認爲 None
import multiprocessing import time def func(msg): print("start:", msg) time.sleep(3) print("end: ",msg) if __name__ == "__main__": pool = multiprocessing.Pool(processes = 3) for i in range(5): msg = "任務%d" %(i) #維持執行的進程總數爲 processes,當一個進程執行完畢後會添加新的進程進去 pool.apply_async(func, (msg, )) pool.close()#進程池關閉之後不再接收新的請求 #調用 join 之前,先調用 close 函數,否則會出錯。 # 執行完 close 後不會有新的進程加入到 pool,join 函數等待所有子進程結束 pool.join()
apply_async 是在一個池工作進程中異步地執行函數(*args, **kwargs),然後返回結果
apply是在一個池工作進程中執行函數(*args, **kwargs),然後返回結果。
這是使用apply執行線程池的線程的
import multiprocessing import time def func(msg): print("start:", msg) time.sleep(3) print("end",msg) if __name__ == "__main__": pool = multiprocessing.Pool(processes = 3) for i in range(5): msg = "任務%d" %(i) #維持執行的進程總數爲 processes,當一個進程執行完畢後會添加新的進程進去 pool.apply(func, (msg, )) pool.close() #調用 join 之前,先調用 close 函數,否則會出錯。 # 執行完 close 後不會有新的進程加入到 pool,join 函數等待所有子進程結束 pool.join()