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...
可见,由于下载和写入文件的速度快慢对每个进程的执行时间是有影响的……