# coding:utf-8 import os import time from multiprocessing import Pool def func(n): print("%s:%s" % (os.getpid(), n)) return n**2 def func2(n): print("%s:%s" % (os.getpid(), n)) time.sleep(1) return n**2 if __name__ == '__main__': start_time = time.time() pool = Pool(5) # 進程池中從無到有創建5個進程,以后一直是這5個進程在執行任務 res_lst = [] for i in range(10): res = pool.apply_async(func, args=(i,)) # 異步運行,根據進程池中有的進程數,每次最多3個子進程在異步執行,並且可以執行不同的任務,傳送任意的參數了。 # 返回結果之后,將結果放入列表,歸還進程,之后再執行新的任務 # 需要注意的是,進程池中的三個進程不會同時開啟或者同時結束 # 而是執行完一個就釋放一個進程,這個進程就去接收新的任務。 res_lst.append(res) # 異步apply_async用法:如果使用異步提交的任務,主進程需要使用join,等待進程池內任務都處理完,然后可以用get收集結果 # 否則,主進程結束,進程池可能還沒來得及執行,也就跟着一起結束了 pool.close() # 不是關閉進程池,而是結束進程池接收任務,確保沒有新任務再提交過來。 pool.join() # 感知進程池中的任務已經執行結束,只有當沒有新的任務添加進來的時候,才能感知到任務結束了,所以在join之前必須加上close方法 print([r.get() for r in res_lst]) # 使用get來獲取apply_aync的結果,如果是apply,則沒有get方法,因為apply是同步執行,立刻獲取結果,也根本無需get print("無阻塞程序的執行時間:", time.time() - start_time) s_time = time.time() pool2 = Pool(5) # 進程池中從無到有創建5個進程,以后一直是這5個進程在執行任務 res_lst = [] for i in range(10): res = pool2.apply_async(func2, args=(i,)) res_lst.append(res) pool2.close() pool2.join() print([r.get() for r in res_lst]) print("有阻塞程序的執行時間:", time.time() - s_time) # 8860:0 # 8860:1 # 8860:2 # 8860:3 # 8860:4 # 8860:5 # 8860:6 # 8860:7 # 8860:8 # 8860:9 # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # 無阻塞程序的執行時間: 0.609375 # 7728:0 # 3668:1 # 7288:2 # 8300:3 # 10168:4 # 7728:5 # 3668:6 # 7288:7 # 8300:8 # 10168:9 # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # 有阻塞程序的執行時間: 2.625