Python 多進程編程之multiprocessing--Pool

Python 多進程編程之multiprocessing--Poolpython

----當須要建立的子進程數量很少的時候,能夠直接利用multiprocessing 中的Process 動態生成多個進程,

----可是,若是是成百上千個任務,手動建立的話,工做量會很大,此時就會用到multiprocessing 下的Pool

----初始化Pool 時,能夠指定一個最大的進程數,當背後的請求提交到Pool 中時,若是池子沒有滿,那麼就會建立一個新的進程來執行該請求. 若是滿了(池子中的進程以及達到最大進程數)那麼該請求就會等待,直到池子中有進程結束,纔會建立新的進程來執行.
編程

from multiprocessing import Pool
import os,time,random

#定義一個函數
def download(i):
    print("(%d)--ID號爲:%d的進程開始執行"%(i,os.getpid()))
    t_start = time.time()

    time.sleep(random.random()*10)

    t_stop = time.time()
    print("(%d)---ID:%d執行完畢,耗時%f秒!"%(i,os.getpid(),t_stop-t_start))


if __name__ == "__main__":
    po = Pool(3)#定義一個進程池,最大進程的數量
    for i in range(10):

        #每次循環將會用空閒出來的子進程去調用目錄--同步(自加阻塞)
        #po.apply(func=download,args=(i,))

        #每次循環將會用空閒出來的子進程去調用目錄--異步
        po.apply_async(func=download,args=(i,))

    print("----start----")
    po.close()#關閉進程池,關閉後po就再也不接收您的請求。
    po.join() #等待po中全部的子進程執行完成,必需放在close以後。
        
    print("----end------")
  •  添加join()的緣由是,
    ----此方法可能不會在頁面打印除任何內容,由於一次執行3個進程
    ----3個進程執行的時間相差極爲短暫,會在打印頁面引發衝突,因此不會有任何內容輸出
  • po.apply(func=download,args=(i,)) 執行的結果以下:你會發現是每次執行一個進程.
  • (0)id號爲:25334的進程開始執行
    (0)id號25334執行完畢,耗時3.866196秒
    (1)id號爲:25335的進程開始執行
    (1)id號25335執行完畢,耗時3.393492秒
    (2)id號爲:25333的進程開始執行
    (2)id號25333執行完畢,耗時9.758717秒
    (3)id號爲:25334的進程開始執行
    (3)id號25334執行完畢,耗時0.150672秒
    (4)id號爲:25335的進程開始執行
    (4)id號25335執行完畢,耗時8.498094秒
    (5)id號爲:25333的進程開始執行
    (5)id號25333執行完畢,耗時9.061761秒
    (6)id號爲:25334的進程開始執行
    (6)id號25334執行完畢,耗時8.845187秒
    (7)id號爲:25335的進程開始執行
    (7)id號25335執行完畢,耗時6.623793秒
    (8)id號爲:25333的進程開始執行
    (8)id號25333執行完畢,耗時2.530908秒
    (9)id號爲:25334的進程開始執行
    (9)id號25334執行完畢,耗時9.739911秒
    ------start-------
    ------end----------
    

     

  •   po.apply_async(func=download,args=(i,))   執行的結果以下:你會發現開始是執行3個進程,以後只要有進程結束,等待的進程就會執行
  • ------start-------
    (1)id號爲:25313的進程開始執行
    (2)id號爲:25314的進程開始執行
    (0)id號爲:25315的進程開始執行
    (0)id號25315執行完畢,耗時0.853286秒
    (3)id號爲:25315的進程開始執行
    (3)id號25315執行完畢,耗時5.674426秒
    (4)id號爲:25315的進程開始執行
    (4)id號25315執行完畢,耗時1.449967秒
    (5)id號爲:25315的進程開始執行
    (1)id號25313執行完畢,耗時9.333982秒
    (6)id號爲:25313的進程開始執行
    (2)id號25314執行完畢,耗時9.982127秒
    (7)id號爲:25314的進程開始執行
    (5)id號25315執行完畢,耗時2.919765秒
    (8)id號爲:25315的進程開始執行
    (7)id號25314執行完畢,耗時2.520782秒
    (9)id號爲:25314的進程開始執行
    (6)id號25313執行完畢,耗時6.414589秒
    (9)id號25314執行完畢,耗時7.013178秒
    (8)id號25315執行完畢,耗時9.927967秒
    ------end----------
    
相關文章
相關標籤/搜索