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官方文档对此有详细解释 。在官方文档中可以看到async with和async

本文介绍了Python3.5以后如何使用异步和多进程进行LFPW数据集的下载。对比了多进程(使用进程池)和异步IO(async/await与aiohttp模块)的性能,结果显示异步方式的下载速度显著优于多进程,主要原因是异步IO的非阻塞特性提高了效率。
最低0.47元/天 解锁文章
967

被折叠的 条评论
为什么被折叠?



