Python使用asyncio+aiohttp实现高效异步并发下载

 更新时间:2026年01月23日 08:36:30   作者:weixin_46244623  
这篇文章主要为大家详细介绍了如何使用 Python 的异步编程模型(asyncio)配合 aiohttp 库,实现真正高效的异步并发下载,大幅提升下载速度,感兴趣的小伙伴可以了解下

在处理多个远程文件下载任务时,如果采用传统的同步方式(如 requests.get() 逐个下载),程序会因等待网络 I/O 而长时间阻塞,效率极低。

本文将教你如何使用 Python 的异步编程模型(asyncio)配合 aiohttp 库,实现真正高效的异步并发下载,大幅提升下载速度,尤其适用于批量下载图片、视频、压缩包等场景。

一、为什么选择 aiohttp + asyncio

  • aiohttp 是基于 asyncio 的高性能异步 HTTP 客户端/服务器框架;
  • 支持异步请求、自动连接池、重定向、超时控制;
  • 语法简洁,性能远超多线程或同步方案;
  • 适合 I/O 密集型任务(如网络下载)。

注意:Python 的“异步” ≠ “多线程”,它是通过事件循环(Event Loop)在单线程中并发处理多个 I/O 操作,避免阻塞。

二、安装依赖

首先安装 aiohttp(若未安装):

pip install aiohttp

推荐同时安装 aiofiles(用于异步写入文件):

pip install aiofiles

三、核心代码实现

方法一:将内容全部加载到内存后保存(适合中小文件)

import asyncio
import aiohttp
import os

async def download_file(session, url, filename):
    """异步下载单个文件"""
    try:
        async with session.get(url) as response:
            if response.status == 200:
                content = await response.read()
                with open(filename, 'wb') as f:
                    f.write(content)
                print(f"✅ 下载成功: {filename}")
            else:
                print(f"❌ 下载失败 ({response.status}): {url}")
    except Exception as e:
        print(f"⚠️  下载出错: {url} | 错误: {e}")

async def download_all(urls, folder="downloads"):
    """并发下载多个文件"""
    os.makedirs(folder, exist_ok=True)

    # 创建 aiohttp 客户端会话(支持连接复用)
    async with aiohttp.ClientSession() as session:
        tasks = []
        for i, url in enumerate(urls):
            # 生成文件名(可根据需要自定义)
            ext = os.path.splitext(url.split('?')[0])[-1] or '.bin'
            filename = os.path.join(folder, f"file_{i+1}{ext}")
            task = asyncio.create_task(download_file(session, url, filename))
            tasks.append(task)

        # 并发执行所有下载任务
        await asyncio.gather(*tasks)

# 使用示例
if __name__ == "__main__":
    urls = [
        "https://example.com/file1.zip",
        "https://example.com/file2.jpg",
        "https://example.com/file3.pdf",
    ]

    print("🚀 开始异步下载...")
    asyncio.run(download_all(urls))
    print("🎉 所有文件下载完成!")

方法二:流式下载(适合大文件,节省内存)

对于大文件(如视频、ISO 镜像),建议使用流式写入,避免一次性加载整个文件到内存:

import aiofiles  # 需要额外安装

async def download_file_stream(session, url, filename):
    try:
        async with session.get(url) as response:
            if response.status == 200:
                async with aiofiles.open(filename, 'wb') as f:
                    async for chunk in response.content.iter_chunked(8192):
                        await f.write(chunk)
                print(f"✅ 流式下载成功: {filename}")
            else:
                print(f"❌ 下载失败 ({response.status}): {url}")
    except Exception as e:
        print(f"⚠️  流式下载出错: {url} | 错误: {e}")

# 在 download_all 中替换 download_file 为 download_file_stream 即可

四、性能优势对比

方式3 个 50MB 文件耗时(估算)
同步下载(requests)~45 秒
多线程(ThreadPoolExecutor)~20 秒
异步下载(aiohttp + asyncio)~15–18 秒

实际提升取决于网络带宽和服务器并发能力。异步方案在高延迟或大量小文件场景下优势更明显。

五、进阶优化建议

1.限制并发数量

若 URL 数量极大(如 1000+),可使用 asyncio.Semaphore 控制并发数,避免打爆目标服务器或本地资源:

semaphore = asyncio.Semaphore(10)  # 最多 10 个并发

async def download_file_limited(session, url, filename):
    async with semaphore:
        await download_file(session, url, filename)

2.添加 User-Agent 和超时

timeout = aiohttp.ClientTimeout(total=30)
async with aiohttp.ClientSession(
    timeout=timeout,
    headers={"User-Agent": "Mozilla/5.0 (Python aiohttp)"}
) as session:

3.自动从 URL 提取文件名

from urllib.parse import urlparse
import os

def get_filename_from_url(url):
    path = urlparse(url).path
    name = os.path.basename(path)
    return name if name else "downloaded_file"

六、总结

  • 使用 asyncio + aiohttp 是 Python 实现高并发下载的最佳实践
  • 异步下载能显著提升效率,尤其适合批量、I/O 密集型任务;
  • 对于大文件,推荐使用流式下载 + aiofiles 避免内存溢出;
  • 生产环境中务必加入错误处理、超时控制、并发限制

掌握这套异步下载方案,你就能轻松应对各种批量资源采集、自动化备份、数据同步等需求!

到此这篇关于Python使用asyncio+aiohttp实现高效异步并发下载的文章就介绍到这了,更多相关Python异步并发下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python如何实现文本转语音

    Python如何实现文本转语音

    文本转语音,一般会用在无障碍开发。下面介绍如何使用Python实现将文本文件转换成语音输出。跟着小编一起来看看吧。
    2016-08-08
  • python yield关键词案例测试

    python yield关键词案例测试

    这篇文章主要介绍了python yield关键词案例测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 教你用YOLOv5实现多路摄像头实时目标检测功能

    教你用YOLOv5实现多路摄像头实时目标检测功能

    目标检测是计算机视觉的研究方向之一,下面这篇文章主要给大家介绍了关于如何利用YOLOv5实现多路摄像头实时目标检测功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • 计算python脚本执行时间的多种方法

    计算python脚本执行时间的多种方法

    在编写Python脚本时,了解脚本的执行时间通常是很有用的,特别是在优化代码或评估性能时,Python提供了多种方法来测量脚本的执行时间,从内置模块到第三方库,可以选择适合你需求的方式,本文将介绍计算 Python 脚本执行时间的多种方法,需要的朋友可以参考下
    2023-11-11
  • Pandas数据分析之groupby函数用法实例详解

    Pandas数据分析之groupby函数用法实例详解

    这篇文章主要为大家介绍了Pandas数据分析之groupby函数用法实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 解决python使用open打开文件中文乱码的问题

    解决python使用open打开文件中文乱码的问题

    下面小编就为大家分享一篇解决python使用open打开文件中文乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • python闭包的实例详解

    python闭包的实例详解

    在本篇文章里小编给大家整理的是一篇关于python闭包的实例详解内容,有兴趣的朋友们可以学习下。
    2021-10-10
  • python通过cmd创建虚拟环境的实现(pip方式)

    python通过cmd创建虚拟环境的实现(pip方式)

    Python的虚拟环境是正常的现实环境相对应的,在虚拟环境中安装的包是与现实环境隔离的,本文主要介绍了python通过cmd创建虚拟环境的实现,感兴趣的可以了解一下
    2023-11-11
  • Python人工智能之混合高斯模型运动目标检测详解分析

    Python人工智能之混合高斯模型运动目标检测详解分析

    运动目标检测是计算机视觉领域中的一个重要内容,其检测效果将会对目标跟踪与识别造成一定的影响,本文将介绍用Python来进行混合高斯模型运动目标检测,感兴趣的朋友快来看看吧
    2021-11-11
  • python解压缩文件或文件夹两种常见方式(附代码)

    python解压缩文件或文件夹两种常见方式(附代码)

    这篇文章主要介绍了python解压缩文件或文件夹两种常见方式,Python的zipfile和shutil模块提供了强大的文件和文件夹压缩与解压缩功能,zipfile模块适合精细控制,而shutil模块则快速简单,文中提供了详细的代码示例,需要的朋友可以参考下
    2025-04-04

最新评论