python基礎學習日誌day10-進程池
阿新 • • 發佈:2017-06-25
isa str sin python基礎 ply img don -- func
一:進程池
進程池內部維護一個進程序列,當使用時,則去進程池中獲取一個進程,
如果進程池序列中沒有可供使用的進進程,那麽程序就會等待,直到進程池中有可用進程為止。
進程池中有兩個方法:
- apply
- apply_async
進程池 apply是串行;apply_async是並行
pool必須先要close在join,進程池中進程執行完畢後再關閉,如果註釋,那麽程序直接關閉
二:代碼示例
有join代碼和結果
# -*- coding:utf-8 -*- __author__ = ‘shisanjun‘ from multiprocessing import Process,Poolimport time def Foo(i): time.sleep(2) return i+100 def Bar(arg): print("-->exec done",arg) if __name__=="__main__":#main如果有main表示手動運行,執行main下面代碼,如果是導入模塊就不執行 pool=Pool(5) for i in range(10): pool.apply_async(func=Foo,args=(i,),callback=Bar) #Foo執行完的結果會當作參數給Bar #callback是主進程調用,比如數據庫連接,如果在子進程每次都生成連接就會占用資源,在主進程只要生成一次 print("end") pool.close() pool.join()#進程池中進程執行完畢後再關閉,如果註釋,那麽程序直接關閉 """ end -->exec done 100 -->exec done 101 -->exec done 102 -->exec done 103 -->exec done 104 -->exec done 105 -->exec done 106 -->exec done 107 -->exec done 108 -->exec done 109"""
沒有join代碼,主進程執行完直接退出了,所以子進行沒有結果輸出
# -*- coding:utf-8 -*- __author__ = ‘shisanjun‘ from multiprocessing import Process,Pool import time def Foo(i): time.sleep(2) return i+100 def Bar(arg): print("-->exec done",arg) if __name__=="__main__":#main如果有main表示手動運行,執行main下面代碼,如果是導入模塊就不執行 pool=Pool(5) for i in range(10): pool.apply_async(func=Foo,args=(i,),callback=Bar) #Foo執行完的結果會當作參數給Bar #callback是主進程調用,比如數據庫連接,如果在子進程每次都生成連接就會占用資源,在主進程只要生成一次 print("end") pool.close() #pool.join()#進程池中進程執行完畢後再關閉,如果註釋,那麽程序直接關閉
python基礎學習日誌day10-進程池