1. 進程、線程、協程基本概念,創建、使用
2. 協程的應用(生成器----第三方模塊)
3. 併發的實踐
一、進程
1.進程的相關概念
程序運行起來之後創建的一個進程。
創建進程已經學過使用multiprocessing.Process類創建
(1)multiprocessing.Process(),指定target參數,創建對象
(2)繼承multiprocessing.Process,重寫run方法
需求:通過比較案例的執行時長,來比較不同的創建進程方式的執行速度
案例: io 計算密集型
累加求和方法
import time
def sum(a,b):
s=0
for i in range(a,b+1):
s+=i
# time.sleep(0.5)
return s
① 不使用進程,不使用線程,直接執行
計算密集型:1.95s
io 密集型: 16s
if __name__=="__main__":
start=time.time()
# sum(0,10000000)
# sum(0,20000000)
sum(0,10)
sum(0,20)
end=time.time()
print("執行的時間{}".format(end-start))
2.使用進程池創建進程
進程池:負責維護一定數量(最大)的進程,可以向進程池提交任務,如果進程池中進程數量沒有達到上限,進程池會幫我們創建一個新的進程,執行任務,否則如果進程池中的進程數量已經達到上限,新任務只能在進程池外等待,等待進程池內進程死亡,或者進程結束,才能再次創建新的進程執行任務。
from multiprocessing import Pool 進程池創建進程
方式:
from multiprocessing import Pool
Pool(進程池中最大的數量)
pool=Pool(5)
相關方法:
apply:同步申請模式
apply_async:異步申請模式
close,暫停關閉
terminate,真正關閉進程池所有任務
join 阻塞主進程,等待子進程的退出(跟close聯合使用)
(1)同步申請模式
串行(排隊執行)
from multiprocessing import Pool
import os
def work():
print("當前進程的id={}".format(os.getpid()))
time.sleep(1)
# 使用進程池創建進程(同步模式創建進程)
if __name__=="__main__":
pool = Pool(5)
# pool.apply(要執行的任務,args=任務的參數元組)
for i in range(3):
pool.apply(work)
print("第{}個任務執行完畢".format(i))
② 使用同步申請模式實現累加和案例
計算密集型 2.1s
io密集型 16.2s
進程池中使用同步方式申請進程,反而執行的比正常串行慢,因爲向進程池申請進程也需要時間。
def sum2(b1,b2):
pool=Pool(4)
pool.apply(sum,args=(0,b1))
pool.apply(sum,args=(0,b2))
if __name__=="__main__":
start=time.time()
# sum2(10000000,20000000)
sum2(10,20)
end=time.time()
print("執行的時間{}".format(end - start))
(2)異步申請模式
異步模式的使用方式
def work(index):
print("第{}個任務".format(index))
time.sleep(1)
if __name__=="__main__":
pool=Pool(4)
for i in range(3):
# pool.apply(work,args=(i,))
pool.apply_async(work,args=(i,))
# print("第{}個任務執行完畢".format(i)) # 不能保證執行完畢work之後才執行。
# 使用join搶佔之前需要先關閉(暫時關閉,長久關閉)進程池
pool.close()
pool.join()
print("主進程執行結束")
使用multiprocessing.Pool異步模式申請的子進程被當成是後臺進程。
如果希望子進程全部在主進程執行結束之前全部執行完畢,使用搶佔進程的方式解決join
使用【進程池對象.join搶佔主進程】
未完待續。。。