1.進程池的概念
python中,進程池內部會維護一個進程序列。當需要時,程序會去進程池中獲取一個進程。
如果進程池序列中沒有可供使用的進程,那么程序就會等待,直到進程池中有可用進程為止。
2.進程池的內置方法
- apply 從進程池里取一個進程並同步執行
- apply_async 從進程池里取出一個進程並異步執行
- terminate 立刻關閉進程池
- join 主進程等待所有子進程執行完畢,必須在close或terminete之后
- close 等待所有進程結束才關閉線程池
同步是指一個進程在執行某個請求的時候,必須要到收到對方返回的信息才繼續執行下去
異步是指進程在執行某個請求時,不管其他的進程的狀態,這個進程就執行后續操作;
當有消息返回時系統會通知進程進行處理,這樣可以提高執行的效率
例如:打電話就是同步通信,發信息就是異步通信。
3.進程池的使用
代碼如下:
from multiprocessing import Pool
import time
def func(args):
time.sleep(1) #程序休眠1s
print("%s------>%s"%(args,time.ctime())) #打印參數及時間
if __name__=="__main__":
p1=Pool(2) #設定開啟2個進程池
for i in range(10):
p1.apply_async(func=func,args=(i,)) #設定異步執行任務
p1.close() #關閉進程池
time.sleep(2) #程序休眠2s
p1.terminate() #關閉進程池
p1.join() #阻塞進程池
print("ending") #打印結束語句
程序執行結果:
0------>Thu Jul 20 20:18:43 2017
1------>Thu Jul 20 20:18:43 2017
ending
可以看到,在程序執行過程中,關閉進程池,則程序會立即停止,不會再繼續執行后續語句。
4.修改程序,使程序能夠執行全部的任務
代碼如下:
from multiprocessing import Pool
import time
def func(args):
time.sleep(1) #休眠1s
print("%s------>%s"%(args,time.ctime())) #打印傳遞的參數及時間
if __name__=="__main__":
p1=Pool(2) #定義2個進程池
for i in range(10): #定義循環10次
p1.apply_async(func=func,args=(i,)) #異步執行任務
p1.close() #等待所有的任務都完成才關閉進程池
p1.join()
print("ending")
執行結果如下:
0------>Thu Jul 20 20:19:12 2017
1------>Thu Jul 20 20:19:12 2017
2------>Thu Jul 20 20:19:13 2017
3------>Thu Jul 20 20:19:13 2017
4------>Thu Jul 20 20:19:14 2017
5------>Thu Jul 20 20:19:14 2017
6------>Thu Jul 20 20:19:15 2017
7------>Thu Jul 20 20:19:15 2017
8------>Thu Jul 20 20:19:16 2017
9------>Thu Jul 20 20:19:16 2017
ending
