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

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

Python 异步编程利用事件循环实现高并发 I/O 处理。文章涵盖协程定义、任务调度、事件循环机制及 asyncio 库用法。通过 aiohttp 构建 HTTP 客户端与 Web 服务器案例,展示非阻塞请求与响应处理。掌握 await、async def 关键字,理解 Future 对象与回调机制,提升网络应用性能。

KernelLab发布于 2026/3/16更新于 2026/10/2593 浏览
Python 异步编程与协程实战指南

异步编程与协程

异步编程概念图

异步编程概述

异步编程是一种并发编程模式,通过非阻塞操作显著提升程序执行效率。在等待 I/O 操作(如网络请求、文件读写)完成时,程序不会挂起,而是继续处理其他任务。这种方式特别适合高并发的网络应用。

核心优势:

  • 提升效率:I/O 等待期间不占用 CPU 资源,可切换至其他任务。
  • 降低开销:相比多线程,减少了线程创建和上下文切换的成本。
  • 代码简洁:利用协程和事件循环,逻辑结构更清晰。

典型场景:

  • 网络通信(HTTP、WebSocket)
  • 大文件读写
  • 数据库异步查询

协程的定义与使用

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

import asyncio

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

asyncio.run(hello())

协程的暂停与恢复由事件循环管理。当遇到 await 时,当前协程挂起,控制权交还给循环,直到被等待的操作完成。

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())

任务调度

创建任务

使用 将协程封装为 Task 对象,以便并发执行。

asyncio.create_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())
任务的取消与超时

任务支持取消操作,需捕获 CancelledError。同时可使用 wait_for 设置超时限制。

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())
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())

事件循环

事件循环是异步编程的心脏,负责调度和执行任务。它不断从队列取出任务运行,直到队列为空。

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())

现代 Python 推荐使用 asyncio.run() 自动管理事件循环生命周期。

asyncio 库详解

常用函数
  • asyncio.run():启动事件循环运行顶层协程。
  • asyncio.create_task():创建并发任务。
  • asyncio.gather():收集多个协程结果。
  • asyncio.wait_for():带超时的等待。
  • asyncio.sleep():模拟异步休眠。
高级用法: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 库实战

安装与基础请求
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 客户端

构建一个支持并发请求的客户端,统计响应长度与耗时。

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 快速搭建异步服务。

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))

总结

本文深入探讨了 Python 异步编程的核心机制。通过理解协程、任务调度与事件循环,开发者能够编写出高效、非阻塞的网络应用。结合 asyncio 与 aiohttp,无论是构建高性能爬虫还是微服务接口,都能获得显著的性能提升。建议在实际项目中多尝试并发场景,巩固对异步模型的理解。

目录

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

更多推荐文章

查看全部
  • CodeX 二次验证手机号
  • 人工智能应用工程师(高级)课程体系与核心能力解读
  • 网络安全入门指南:技术基础与学习路径
  • 大模型日报:今日必读的 9 篇前沿论文
  • C++ 基础语法与算法初步:从循环到递归
  • 注意力机制与 Transformer 模型实战
  • HTML5+CSS3+JavaScript 实现高木同学圣诞树 GalGame 开发
  • Open WebUI 与 Ollama 模型文件默认存储路径说明
  • JDK 21 与 JDK 8 主要新特性对比
  • C++ Connector 与 MySQL:配置陷阱与性能优化深度解析
  • 近五年体内微纳米机器人肿瘤精准治疗综述:聚焦胶质母细胞瘤
  • 鸿蒙 HarmonyOS 与 Flutter 3.27.4 混合开发:开发环境配置
  • MySQL 图形化界面工具详解与选型指南
  • 大语言模型 InternLM2(书生·浦语)一键部署
  • 从零开始训练大型语言模型(LLM)实战指南
  • STM32 运行 AI 大模型的四种方案与案例
  • Project AirSim 无人机避障算法解析
  • Java 后端 Web API 开发实战:从架构到部署
  • OpenCV 形态学操作与乐谱线条提取
  • Linux System V 共享内存:原理、实操与避坑

相关免费在线工具

  • 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