在实际项目中,难免会有短时间下载文件的需要。正常的批量下载文件要等前一个文件下载完成后才进行下一个文件的下载工作,下载速度较慢。而通过异步来下载可以实现多个文件同时下载的多线程操作。下面为异步下载文件的实现方法:
首先需要通过
pip install aiohttp
下载aiohttp
模块。引入相关模块如下:
1
2
3
4
5
6
7
8
9import requests
import aiohttp
import asyncio
import os
import uuid
import config
from services import dbc
from utils.response_helper import make_resp
from models.auth import *定义函数
batch_download
用于批量下载:1
2
3
4
5
6
7
8
9async def batch_download(url_list):
async with aiohttp.ClientSession() as session:
tasks=[]
result=[]
for i in range(len(url_list)):
tasks.append(save_file(session, url_list[i]))
finished, unfinished = await asyncio.wait(tasks)
result=[r.result() for r in finished]
return result定义函数
save_file
用于保存文件:1
2
3
4
5
6
7
8
9
10
11
12
13async def save_file(session,url):
name=os.path.basename(url)
path = os.path.join(os.path.dirname(os.getcwd()), 'test', 'images') # 拼接文件保存的相对路径
if not os.path.exists(path):
os.mkdir(path)
file=await session.get(url)
suffix=name[name.rfind('.'):] # 截取文件后缀
filename = uuid.uuid1().hex
file_abolutepath = os.path.join(path, filename+suffix)# 拼接文件保存的绝对路径
file_code=await file.read()
with open(file_abolutepath,'wb') as f:
f.write(file_code)
return str(filename)通过
asyncio.run
方法调用批量下载函数batch_download
:1
2asyncio.run(batch_download(urlList))
#其中urlList的数据格式为[url1,url2],url1和url2是需要下载的文件地址,例如urlList=['http://www.baidu.com','http://tangmenjue.top']通过以上方法即可实现异步下载文件