Python的多進程可以借助from multiprocessing import Pool來實現。
簡而言之分為這樣幾步:
導入包from multiprocessing import Pool
編寫任務函數。def 任務函數(參數)
實例化進程池并設置進程數。pool=Pool(欲設置的進程數)
開始布置任務,把多個任務添加進多進程池。pool.apply_async(任務函數,函數對應的參數元組)
關閉進程池的打包。pool.close()
開始執行多進程。pool.join()
具體使用方式詳見代碼:
import requests
from multiprocessing import Pool
def mission(url,n): #多進程要調用的任務函數,這里我把視頻的編號也帶上留作打印
print(url,"say hi") #來個標記,打印視頻的URL
response=requests.get(url) #請求視頻內容
f=open(f"./%03d.ts"%n,"wb") #打開空文件
f.write(response.content) #寫入下載內容到空的視頻文件中
f.close() #寫入結束
print("%03d.ts OK..."%n) #打印告知視頻已寫入完畢
if __name__ == "__main__":
pool=Pool(10) #設置10個進程
for n in range(1,7): #我有6小段視頻等待爬取
url = f"https://fable.vzaar.com/v4/usp/vz7b388613953b4867b8ea4436f03475ea/16997578.ism/16997578-audio_eng=123960-video_eng=511000-{n}.ts"
pool.apply_async(mission,(url,n)) #任務函數、視頻、編號打包進多進程池里
pool.close() #打包完畢
pool.join() #開始執行多進程
綜上所述。多進程需要這幾步:
from multiprocessing import Pool
編寫任務函數。這里我們用的是def mission(url,n):
實例化,設置進程數。這里我們用的是pool=Pool(10) #設置10個進程
把多個任務添加進多進程池。這里我們用的是for循環配合pool.apply_async(mission,(url,n))來添加進去,注意apply_async的使用方法是apply_async(任務函數,函數對應的參數元組)。
打包完畢,關閉打包。pool.close()
開始執行多進程。pool.join()
運行結果:
https://fable.vzaar.com/v4/usp/vz7b388613953b4867b8ea4436f03475ea/16997578.ism/16997578-audio_eng=123960-video_eng=511000-1.ts say hi
https://fable.vzaar.com/v4/usp/vz7b388613953b4867b8ea4436f03475ea/16997578.ism/16997578-audio_eng=123960-video_eng=511000-2.ts say hi
https://fable.vzaar.com/v4/usp/vz7b388613953b4867b8ea4436f03475ea/16997578.ism/16997578-audio_eng=123960-video_eng=511000-4.ts say hi
https://fable.vzaar.com/v4/usp/vz7b388613953b4867b8ea4436f03475ea/16997578.ism/16997578-audio_eng=123960-video_eng=511000-3.ts say hi
https://fable.vzaar.com/v4/usp/vz7b388613953b4867b8ea4436f03475ea/16997578.ism/16997578-audio_eng=123960-video_eng=511000-6.ts say hi
https://fable.vzaar.com/v4/usp/vz7b388613953b4867b8ea4436f03475ea/16997578.ism/16997578-audio_eng=123960-video_eng=511000-5.ts say hi
006.ts OK...
004.ts OK...
002.ts OK...
005.ts OK...
003.ts OK...
001.ts OK...
可見,由于下載和寫入文件的速度快慢對每個進程的執行時間是有影響的……