唐抉的个人博客

python异步多线程下载文件

字数统计: 372阅读时长: 1 min
2023/11/01

在实际项目中,难免会有短时间下载文件的需要。正常的批量下载文件要等前一个文件下载完成后才进行下一个文件的下载工作,下载速度较慢。而通过异步来下载可以实现多个文件同时下载的多线程操作。下面为异步下载文件的实现方法:

  • 首先需要通过pip install aiohttp下载aiohttp模块。

  • 引入相关模块如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import 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
    9
    async 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
    13
    async 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
    2
    asyncio.run(batch_download(urlList))
    #其中urlList的数据格式为[url1,url2],url1和url2是需要下载的文件地址,例如urlList=['http://www.baidu.com','http://tangmenjue.top']

  • 通过以上方法即可实现异步下载文件

CATALOG