1. 程式人生 > >python基礎學習日誌day10-進程池

python基礎學習日誌day10-進程池

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,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()#進程池中進程執行完畢後再關閉,如果註釋,那麽程序直接關閉 """ 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-進程池