Python自3.5以来,引入了async
和await
关键字,更好支持了异步IO的操作。本文以下载LFPW数据集为例,对比多进程和异步IO。
LFPW
LFPW was used to evaluate a face part (facial fiducial point) detection method which was trained on 1,132 images and tested on 300 images, and so the data set is divided into two files, one for training and testing.
LFPW是人脸特征点检测的一个数据集。和别的数据集不一样的是,这个数据集没有给出图片,仅仅给出了图片的url。该数据集共给出了1132张训练集和300张测试集数据,由于很多图片url失效,所以1132张图片并不能完全下载下来。这些图片的url保存在一个csv文件中,需要从csv读取到url后进行下载。csv的读取使用了ReadCSV
模块,url解析使用了URLParser
模块。
多进程
多进程下载使用进程池进行下载。首先引入multiprocessing
模块,使用Pool
创建进程池,随后将任务加入进程池就完成了。
def main_downloader(csv_path,save_image_path):
url_list=readcsv(csv_path)
p=Pool(4)
for image_url in url_list:
p.apply_async(download_one_url,args=(image_url,save_image_path))
p.close()
p.join()
print("Everything is OK")
p=Pool(4)
创建一个大小为4的进程池,使用p.apply_async()
将任务加入进程池,对Pool
对象调用join()
方法会等待所有子进程执行完毕,调用join()
之前必须先调用close()
,调用close()
之后就不能继续添加新的任务了。
异步
Python3.5中实现异步操作的是async和await关键字,Python官方文档对此有详细解释 。