在利用Python進行系統管理的時候,特別是同時操作多個文件目錄,或者遠程控制多臺主機,并行操作可以節約大量的時間。多進程是實現并發的手段之一,需要注意的問題是:
1)很明顯需要并發執行的任務通常要遠大于核數
2)一個操作系統不可能無限開啟進程,通常有幾個核就開幾個進程
3)進程開啟過多,效率反而會下降(開啟進程是需要占用系統資源的,而且開啟多余核數目的進程也無法做到并行)
例如當被操作對象數目不大時,可以直接利用multiprocessing中的Process動態成生多個進程,十幾個還好,但如果是上百個,上千個。。。手動的去限制進程數量卻又太過繁瑣,此時可以發揮進程池的功效。
我們就可以通過維護一個進程池來控制進程數目,比如httpd的進程模式,規定最小進程數和最大進程數...
對于遠程過程調用的高級應用程序而言,應該使用進程池,Pool可以提供指定數量的進程,供用戶調用,當有新的請求提交到pool中時,如果池還沒有滿,那么就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到規定最大值,那么該請求就會等待,直到池中有進程結束,就重用進程池中的進程。
創建進程池的類:如果指定numprocess為3,則進程池會從無到有創建三個進程,然后自始至終使用這三個進程去執行所有任務,不會開啟其他進程
1Pool([numprocess[,initializer[,initargs]]]):創建進程池
參數介紹:
1numprocess:要創建的進程數,如果省略,將默認使用cpu_count()的值
2initializer:是每個工作進程啟動時要執行的可調用對象,默認為None
3initargs:是要傳給initializer的參數組
主要方法:
1p.apply(func[,args[,kwargs]])
在一個池工作進程中執行func(*args,**kwargs),然后返回結果。
需要強調的是:此操作并不會在所有池工作進程中并執行func函數。如果要通過不同參數并發地執行func函數,必須從不同線程調用p.apply()函數或者使用p.apply_async()
2p.apply_async(func[,args[,kwargs]]):
在一個池工作進程中執行func(*args,**kwargs),然后返回結果。
此方法的結果是AsyncResult類的實例,callback是可調用對象,接收輸入參數。當func的結果變為可用時,
將理解傳遞給callback。callback禁止執行任何阻塞操作,否則將接收其他異步操作中的結果。
3p.close():關閉進程池,防止進一步操作。如果所有操作持續掛起,它們將在工作進程終止前完成
4P.jion():等待所有工作進程退出。此方法只能在close()或teminate()之后調用
應用
同步調用applay
異步調用apply_async
apply_async與apply詳解
使用進程池維護固定數目的進程
server端
客戶端
發現:并發開啟多個客戶端,服務端同一時間只有3個不同的pid,干掉一個客戶端,另外一個客戶端才會進來,被3個進程之一處理
回掉函數:
需要回調函數的場景:進程池中任何一個任務一旦處理完了,就立即告知主進程:我好了額,你可以處理我的結果了。主進程則調用一個函數去處理該結果,該函數即回調函數
我們可以把耗時間(阻塞)的任務放到進程池中,然后指定回調函數(主進程負責執行),這樣主進程在執行回調函數時就省去了I/O的過程,直接拿到的是任務的結果。
以上內容為大家介紹了python進程池,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。