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

Python 异步编程与协程详解

Python 异步编程利用非阻塞 I/O 提高程序效率。核心涉及协程、任务调度与事件循环。文章讲解 asyncio 库的基础用法及常用函数,包括运行协程、创建任务、收集结果与超时控制。结合 aiohttp 库演示了 GET、POST 及 JSON 请求的发送方法。通过异步 HTTP 客户端与 Web 服务器的实战案例,展示如何并发处理网络请求,减少线程切换开销,优化资源利用率。

LinuxPan发布于 2026/3/29更新于 2026/10/2591 浏览
Python 异步编程与协程详解

异步编程与协程

在这里插入图片描述

学习目标与重点

学习目标:掌握 Python 异步编程的基本概念和方法,包括协程、任务调度、事件循环等;学习 asyncio、aiohttp 等核心库的使用;通过实战案例开发异步应用程序。

学习重点:协程的定义与使用、任务调度、事件循环、asyncio 库、aiohttp 库、异步编程实战。

异步编程概述

什么是异步编程

异步编程是一种并发编程方式,通过非阻塞的操作提高程序的执行效率。在异步编程中,程序可以在等待 I/O 操作完成时继续执行其他任务,而不需要阻塞等待。

异步编程的优势
  • 提高执行效率:在等待 I/O 操作完成时,程序可以继续执行其他任务。
  • 降低资源消耗:减少了线程切换的开销。
  • 简化代码结构:通过协程和任务调度,代码结构更加简洁。
异步编程的应用场景
  • 网络通信:如 HTTP 请求、Web 服务器、WebSocket 通信等。
  • 文件操作:如大文件的读取和写入。
  • 数据库操作:如异步数据库查询。

协程的定义与使用

协程的定义

协程(Coroutine)是一种轻量级的线程,可以在程序中进行暂停和恢复。在 Python 中,协程可以通过 async def 关键字定义。

协程的使用
import asyncio

# 定义协程
async def hello():
    print('Hello, World!')
    await asyncio.sleep(1)
    print('Hello again!')

# 运行协程
asyncio.run(hello())
协程的暂停与恢复
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())

任务调度

创建任务
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())
任务的超时
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())
事件循环的运行
import asyncio

# 获取事件循环
loop = asyncio.get_event_loop()

# 定义协程
async def hello():
    print('Hello, World!')
    await asyncio.sleep(1)
    print('Hello again!')

# 运行多个协程
loop.run_until_complete(asyncio.gather(hello(), hello(), hello()))

asyncio 库

asyncio 的基本用法
import asyncio

# 定义协程
async def hello():
    print('Hello, World!')
    await asyncio.sleep(1)
    print('Hello again!')

# 运行协程
asyncio.run(hello())
asyncio 的常用函数
  • asyncio.run():运行协程。
  • asyncio.create_task():创建任务。
  • asyncio.gather():收集多个协程的结果。
  • asyncio.wait_for():等待协程完成,设置超时。
  • asyncio.sleep():暂停协程。
asyncio 的高级用法
import asyncio

# 定义协程
async def hello():
    print('Hello, World!')
    await asyncio.sleep(1)
    print('Hello again!')

# 使用 Future 对象
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
pip install aiohttp
发送 HTTP 请求
import aiohttp
import asyncio

# 发送 GET 请求
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 请求
import aiohttp
import asyncio
import json

# 发送 POST 请求
async def post_data(session, url, data):
    async with session.post(url, data=data) as response:
        return await response.text()

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

asyncio.run(main())
发送 JSON 请求
import aiohttp
import asyncio
import json

# 发送 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 客户端,支持以下功能:

  • 发送 HTTP 请求。
  • 并发发送多个 HTTP 请求。
  • 处理响应数据。
代码实现
import aiohttp
import asyncio
import time

# 发送 HTTP 请求
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

# 并发发送 HTTP 请求
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}秒')
实施过程
  1. 安装 aiohttp 库。
  2. 定义发送 HTTP 请求的协程函数。
  3. 定义并发发送 HTTP 请求的协程函数。
  4. 运行程序。
最终效果

通过异步 HTTP 客户端,我们可以实现以下功能:

  • 发送 HTTP 请求。
  • 并发发送多个 HTTP 请求。
  • 处理响应数据。

实战案例:异步 Web 服务器

需求分析

开发一个异步 Web 服务器,支持以下功能:

  • 处理 HTTP 请求。
  • 提供静态文件服务。
  • 实现简单的 API 接口。
代码实现
from aiohttp import web
import asyncio

# 处理根路径请求
async def handle_root(request):
    return web.Response(text='Hello, World!')

# 处理 API 接口请求
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')

# 创建 Web 应用
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

# 运行 Web 服务器
if __name__ == '__main__':
    asyncio.run(web.run_app(create_app(), host='localhost', port=8080))
实施过程
  1. 安装 aiohttp 库。
  2. 定义处理 HTTP 请求的协程函数。
  3. 创建 Web 应用。
  4. 添加路由。
  5. 运行 Web 服务器。
最终效果

通过异步 Web 服务器,我们可以实现以下功能:

  • 处理 HTTP 请求。
  • 提供静态文件服务。
  • 实现简单的 API 接口。

总结

本文详细介绍了 Python 异步编程的基本概念和方法,包括协程、任务调度、事件循环等;学习了 asyncio、aiohttp 等核心库的使用;通过实战案例开发了异步 HTTP 客户端和异步 Web 服务器。建议读者在学习过程中多练习,通过编写代码加深对知识点的理解。

目录

  1. 异步编程与协程
  2. 学习目标与重点
  3. 异步编程概述
  4. 什么是异步编程
  5. 异步编程的优势
  6. 异步编程的应用场景
  7. 协程的定义与使用
  8. 协程的定义
  9. 协程的使用
  10. 定义协程
  11. 运行协程
  12. 协程的暂停与恢复
  13. 定义协程
  14. 运行多个协程
  15. 任务调度
  16. 创建任务
  17. 定义协程
  18. 创建任务
  19. 任务的取消
  20. 定义协程
  21. 创建任务并取消
  22. 任务的超时
  23. 定义协程
  24. 任务超时
  25. 事件循环
  26. 事件循环的概述
  27. 获取事件循环
  28. 获取事件循环
  29. 定义协程
  30. 运行协程
  31. 事件循环的运行
  32. 获取事件循环
  33. 定义协程
  34. 运行多个协程
  35. asyncio 库
  36. asyncio 的基本用法
  37. 定义协程
  38. 运行协程
  39. asyncio 的常用函数
  40. asyncio 的高级用法
  41. 定义协程
  42. 使用 Future 对象
  43. aiohttp 库
  44. 安装 aiohttp
  45. 发送 HTTP 请求
  46. 发送 GET 请求
  47. 发送 POST 请求
  48. 发送 POST 请求
  49. 发送 JSON 请求
  50. 发送 JSON 请求
  51. 实战案例:异步 HTTP 客户端
  52. 需求分析
  53. 代码实现
  54. 发送 HTTP 请求
  55. 并发发送 HTTP 请求
  56. 运行程序
  57. 实施过程
  58. 最终效果
  59. 实战案例:异步 Web 服务器
  60. 需求分析
  61. 代码实现
  62. 处理根路径请求
  63. 处理 API 接口请求
  64. 提供静态文件服务
  65. 创建 Web 应用
  66. 运行 Web 服务器
  67. 实施过程
  68. 最终效果
  69. 总结

更多推荐文章

查看全部
  • OpenHarmony 环境下 Flutter 使用 objectid 实现离线分布式 ID 引擎
  • 自然语言处理在金融领域的实战应用
  • Java MCP SDK 高效开发实战指南
  • Python FastAPI 入门实战:从零构建生产级 RESTful API
  • C语言指针与数组的深度关联及实战应用
  • AI 中转 API 原理揭秘:低价背后的机制与风险
  • Linux 系统编程:深入理解一切皆文件与缓冲区原理及实战封装
  • 自动化机器学习实战:从原理到企业级部署
  • Linux 基础指令介绍(上)
  • C++ 多线程同步:原子操作(atomic)实战
  • Memo AI 评测:基于 Whisper 的本地视频转文字工具
  • SpringBoot 整合 Langchain4j 实现会话记忆存储深度解析
  • AI 与存储结合:智能存储实践与挑战
  • Ego Planner 算法仿真环境与解耦架构实现
  • 具身智能中的 Python 行为树 (py_trees) 解析与实战
  • 命令行大模型上下文协议(MCP)工具:MCPHost 实践指南
  • LLaMA 2/3、Qwen 与 DeepSeek 开源大模型技术对比分析
  • Spring Boot 3.x 核心依赖版本兼容性指南
  • C++ 多态深度解析:从虚函数表到底层机制
  • C++ 哈希表封装:模拟实现 unordered_map 与 unordered_set

相关免费在线工具

  • 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