跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Python

Python 异步编程与协程详解

Python 异步编程利用非阻塞 I/O 提升执行效率。核心概念涉及协程、任务调度与事件循环。主要介绍 asyncio 库的基础函数如 run、create_task、gather 及超时处理。结合 aiohttp 库演示发送 GET、POST 及 JSON 请求的方法。通过构建异步 HTTP 客户端与 Web 服务器的实战案例,展示高并发场景下的代码实现与性能优势。

咸鱼开飞机发布于 2026/3/15更新于 2026/5/1211 浏览
Python 异步编程与协程详解

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 请求的发送流程。通过构建异步 HTTP 客户端与 Web 服务器的实战案例,展示了高并发场景下的代码实现与性能优势。建议读者结合代码练习以加深理解。

目录

  1. Python 异步编程与协程详解
  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. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 双指针算法详解:移动零、复写零、快乐数及盛水容器问题
  • Cute_Animal_For_Kids_Qwen_Image 儿童专属 AI 绘画工具使用指南
  • 三菱 PLC 顺控指令 STL/RET
  • AI 领域新宠:小语言模型 (SLM)
  • Harness Engineering:给 AI 套上缰绳的工程学
  • OpenClaw 实战:构建多功能 AI 数字替身与场景应用
  • 昇腾设备部署 llama.cpp
  • 豆包·图像创作模型 Seedream 4.0 多图融合功能体验与评测
  • Microsoft Word 的 5 种视图详解:页面、阅读、Web 版式、大纲与草稿
  • Linux 新手入门:软件安装、Vim 操作与 GCC 编译基础工具链
  • 位运算算法核心技巧与经典例题解析
  • Neo4j 图数据库核心概念与在线控制台实战
  • 机器人 DH 参数模型与正运动学
  • 火山引擎大模型语音识别 ASR 技术实践与代码实现
  • Spring Boot 集成 Neo4j 图数据库实战教程
  • DeepSeek 与通义万相结合制作 AI 视频实战指南
  • 被工具定义的编程时代:VS Code、Copilot 与 JetBrains 效率实践
  • Beautiful Hugo 主题快速入门:搭建首个静态博客指南
  • Spring AI 框架入门与实战指南
  • HarmonyOS NEXT 分布式软总线技术架构

相关免费在线工具

  • 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