跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python大前端

Python 异步编程与协程实战指南

Python 异步编程核心机制涵盖协程、事件循环及 asyncio 库。通过 aiohttp 构建高并发 HTTP 客户端与 Web 服务器,展示非阻塞 I/O 性能优势与代码实现,帮助开发者掌握高效并发处理方案。

刀狂发布于 2026/3/29更新于 2026/10/1788 浏览
Python 异步编程与协程实战指南

Python 异步编程与协程实战指南

异步编程示意图

异步编程概述

异步编程是一种通过非阻塞操作提升程序执行效率的并发方式。在等待 I/O 操作(如网络请求、文件读写)完成时,程序不会挂起,而是继续处理其他任务。这种机制特别适用于高并发的网络通信、大文件处理及数据库查询场景。

相比传统线程模型,异步编程能显著降低资源消耗,减少线程切换开销,并通过协程和任务调度让代码结构更加简洁。

协程的定义与使用

协程(Coroutine)是轻量级的用户态线程,支持暂停和恢复执行。在 Python 中,我们使用 async def 关键字来定义协程函数。

基本协程示例

import asyncio

async def hello():
    print('Hello, World!')
    await asyncio.sleep(1)
    print('Hello again!')

# 运行协程
asyncio.run(hello())

注意 await 关键字,它表示当前协程在此处暂停,直到被等待的对象完成。多个协程可以通过 asyncio.gather() 并发执行:

import asyncio

async def count():
    print('Counting...')
    await asyncio.sleep(1)
    print('Counted!')

async def main():
    await asyncio.gather(count(), count(), count())

asyncio.run(main())

任务调度管理

在实际开发中,我们需要对协程进行更精细的控制,包括创建任务、取消任务以及设置超时。

创建与管理任务

使用 asyncio.create_task() 可以将协程封装为 Task 对象,便于后续管理和取消。

import asyncio

async def hello():
    print('Hello, World!')
    await asyncio.sleep(1)
    print('Hello again!')

async def main():
    task1 = asyncio.create_task(hello())
    task2 = asyncio.create_task(hello())
    await task1
    await task2

asyncio.run(main())

任务取消与超时

处理异常是健壮性的关键。如果任务需要被取消,或者执行时间过长,我们需要捕获相应的异常。

import asyncio

async def hello():
    try:
        print('Hello, World!')
        await asyncio.sleep(1)
        print('Hello again!')
    except asyncio.CancelledError:
        print('Task cancelled!')

async def main():
    task = asyncio.create_task(hello())
    await asyncio.sleep(0.5)
    task.cancel()
    try:
        await task
    except asyncio.CancelledError:
        print('Main: Task cancelled!')

asyncio.run(main())

对于超时控制,asyncio.wait_for() 非常实用,它能确保任务在规定时间内完成,否则抛出 TimeoutError。

import asyncio

async def hello():
    print('Hello, World!')
    await asyncio.sleep(2)
    print('Hello again!')

async def main():
    try:
        await asyncio.wait_for(hello(), timeout=1)
    except asyncio.TimeoutError:
        print('Task timed out!')

asyncio.run(main())

事件循环核心

事件循环(Event Loop)是异步编程的心脏,负责从任务队列中取出任务并调度执行。虽然现代 Python 推荐使用 asyncio.run() 自动管理循环,但在某些底层场景中,直接获取和操作循环依然必要。

import asyncio

loop = asyncio.get_event_loop()

async def hello():
    print('Hello, World!')
    await asyncio.sleep(1)
    print('Hello again!')

loop.run_until_complete(hello())

asyncio 库详解

asyncio 是 Python 标准库中实现异步 I/O 的核心模块。

常用函数速查

  • asyncio.run(): 启动事件循环,运行顶层协程。
  • asyncio.create_task(): 创建后台任务。
  • asyncio.gather(): 收集多个协程的结果。
  • asyncio.wait_for(): 带超时的等待。
  • asyncio.sleep(): 模拟异步延迟。

高级用法:Future 对象

在处理回调逻辑时,Future 对象提供了灵活的状态通知机制。

import asyncio

async def hello():
    print('Hello, World!')
    await asyncio.sleep(1)
    print('Hello again!')

async def main():
    future = asyncio.Future()
    task = asyncio.create_task(hello())
    task.add_done_callback(lambda t: future.set_result(t.result()))
    await future

asyncio.run(main())

aiohttp 库实战

aiohttp 是基于 asyncio 的 HTTP 客户端和服务端库,非常适合构建高性能 Web 应用。

安装与基础请求

首先安装依赖:

pip install aiohttp

发送 GET 请求示例:

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'https://www.example.com')
        print(html)

asyncio.run(main())

发送 POST 请求和 JSON 数据同样简单:

import aiohttp
import asyncio
import json

async def post_json(session, url, data):
    async with session.post(url, json=data) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        data = {'name': '张三', 'age': 25}
        response = await post_json(session, 'https://httpbin.org/post', data)
        print(response)

asyncio.run(main())

实战案例:高并发 HTTP 客户端

下面是一个完整的异步 HTTP 客户端示例,支持并发请求多个 URL 并统计耗时。

import aiohttp
import asyncio
import time

async def fetch(session, url):
    start_time = time.time()
    async with session.get(url) as response:
        text = await response.text()
        elapsed_time = time.time() - start_time
        return url, len(text), elapsed_time

async def main():
    urls = [
        'https://www.example.com',
        'https://www.google.com',
        'https://www.github.com',
        'https://www.python.org',
        'https://www.djangoproject.com'
    ]
    async with aiohttp.ClientSession() as session:
        tasks = [asyncio.create_task(fetch(session, url)) for url in urls]
        results = await asyncio.gather(*tasks)
        for url, length, elapsed_time in results:
            print(f'URL: {url}, 响应长度:{length}, 耗时:{elapsed_time:.2f}秒')

if __name__ == '__main__':
    start_time = time.time()
    asyncio.run(main())
    elapsed_time = time.time() - start_time
    print(f'总耗时:{elapsed_time:.2f}秒')

这个脚本展示了如何利用异步特性同时发起多个请求,而不是串行等待,从而大幅提升整体吞吐量。

实战案例:异步 Web 服务器

利用 aiohttp.web 模块,我们可以快速搭建一个异步 Web 服务。

from aiohttp import web
import asyncio

async def handle_root(request):
    return web.Response(text='Hello, World!')

async def handle_api(request):
    data = {'name': '张三', 'age': 25}
    return web.json_response(data)

async def handle_static(request):
    return web.FileResponse('static/index.html')

async def create_app():
    app = web.Application()
    app.add_routes([
        web.get('/', handle_root),
        web.get('/api', handle_api),
        web.get('/static/{name}', handle_static)
    ])
    return app

if __name__ == '__main__':
    asyncio.run(web.run_app(create_app(), host='localhost', port=8080))

该服务器能够处理根路径访问、返回 JSON API 数据以及提供静态文件服务,所有请求处理均是非阻塞的。

总结

掌握 Python 异步编程的关键在于理解事件循环与协程的配合。通过 asyncio 和 aiohttp,开发者可以编写出高效、低资源消耗的并发程序。无论是构建高并发爬虫还是微服务接口,异步模式都是现代 Python 开发不可或缺的技能。建议在实际项目中多尝试结合具体业务场景练习,深入体会其性能优势。

目录

  1. Python 异步编程与协程实战指南
  2. 异步编程概述
  3. 协程的定义与使用
  4. 基本协程示例
  5. 运行协程
  6. 任务调度管理
  7. 创建与管理任务
  8. 任务取消与超时
  9. 事件循环核心
  10. asyncio 库详解
  11. 常用函数速查
  12. 高级用法:Future 对象
  13. aiohttp 库实战
  14. 安装与基础请求
  15. 实战案例:高并发 HTTP 客户端
  16. 实战案例:异步 Web 服务器
  17. 总结

更多推荐文章

查看全部
  • 普通人如何利用 AI 工具提升效率与变现
  • VS Code 远程连接时 Copilot Chat 图标不显示的解决方案
  • 宇树 Unitree 机器人 ROS 2 环境部署指南 (Go2/B2/H1)
  • FastAPI:Python 高性能 Web 框架的优雅之选
  • Quartus Prime Lite 23.1 与 ModelSim 18.1 安装及联调指南
  • Python 3.12 下载与安装配置指南
  • Ubuntu 部署 OpenClaw 完整教程
  • 在 VSCode 里从零构建 AI 智能体:思路、配置与实战整合
  • C++ 红黑树详解:原理与实现
  • Vue 实例劫持突破 Web 编辑器粘贴限制
  • 反爬虫:机器人点选验证原理及网站设计
  • Docker Logs 命令:从基础到高级日志管理
  • 前端调用 Solidity 智能合约连接 MetaMask 钱包并部署至 Alchemy 测试网
  • 《Agent Runtime 工程化》我对生产级 Agent Runtime 的 10 条工程判断
  • AI 编程工具深度对比:Cursor、Copilot、Trae 与 Claude Code
  • 前端代码可读性优化:让代码更易维护与协作
  • Spring AI 支持 Agent Skills 模块化能力详解
  • P1203 [IOI 1993 / USACO1.1] 坏掉的项链 Broken Necklace Python 题解
  • llama.cpp 重大更新:自带 Web UI,性能表现优异,本地大模型部署新方案
  • Java 基础 (1):Spring Web MVC 核心解析

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online