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

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

Python 异步编程利用非阻塞 I/O 提升并发效率,核心涉及协程、任务调度与事件循环。 asyncio 库的基础用法及 aiohttp 网络库实践,涵盖协程定义、任务创建与取消、超时控制等关键机制。通过构建异步 HTTP 客户端与 Web 服务器的实战案例,展示如何在实际开发中实现高并发数据处理与接口服务,帮助开发者掌握现代 Python 后端开发的核心技能。

城市逃兵发布于 2026/3/26更新于 2026/10/1594 浏览
Python 异步编程与协程实战指南

异步编程核心概念

在构建高并发应用时,理解 Python 的异步机制至关重要。它允许程序在等待 I/O 操作完成时继续执行其他任务,从而显著提升效率。

什么是异步编程

异步编程通过非阻塞操作提高执行效率。当程序遇到网络请求或文件读写等耗时操作时,无需挂起整个线程,而是切换到其他任务。这种方式减少了资源消耗,简化了代码结构。

常见应用场景包括网络通信(HTTP、WebSocket)、大文件操作以及数据库查询。

协程的定义与使用

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

import asyncio

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

asyncio.run(hello())

这里我们直接调用 asyncio.run() 启动事件循环并运行协程。注意 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.cancel()。

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 设置超时时间:

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

asyncio 库核心函数

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 异步网络库

处理 HTTP 请求时,推荐使用 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 请求时,可以直接传递数据字典:

import aiohttp
import asyncio

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'
    ]
    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 create_app():
    app = web.Application()
    app.add_routes([
        web.get('/', handle_root),
        web.get('/api', handle_api),
    ])
    return app

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

这里定义了根路径和 API 接口路由。启动后,你可以访问 http://localhost:8080/api 获取 JSON 数据。这种基于协程的服务器模型在处理大量连接时表现优异。

总结

掌握异步编程的关键在于理解事件循环和协程的生命周期。通过 asyncio 和 aiohttp,我们可以编写出既高效又简洁的网络应用。建议在实际项目中多尝试并发场景,体会非阻塞 IO 带来的性能提升。

目录

  1. 异步编程核心概念
  2. 什么是异步编程
  3. 协程的定义与使用
  4. 协程的并发执行
  5. 任务调度与管理
  6. 创建与取消任务
  7. 设置超时
  8. asyncio 库核心函数
  9. aiohttp 异步网络库
  10. 安装与基础用法
  11. 实战案例:异步 HTTP 客户端
  12. 实战案例:异步 Web 服务器
  13. 总结

更多推荐文章

查看全部
  • C++网络编程:TCP服务器与客户端实现
  • FPGA 开发常用软件对比:Vivado、Quartus、ModelSim 详解
  • C++ STL 哈希表详解:原理、冲突处理与模拟实现
  • Vue3 主流 AI 代码助手安装与配置指南
  • PowerShell 中 Invoke-WebRequest 的正确使用:避免参数匹配错误
  • 前端开发:Jenkins 与 Gitee 集成实现持续集成与部署
  • 基于 Spring Boot 的书法比赛评分系统设计与实现
  • 基于宝塔面板在阿里云部署 Java+React 项目
  • MiroFish:基于群体智能的万物预测引擎
  • Linux 系统 Docker 安装、配置与核心使用实战
  • IDEA 中可免费使用的 AI 代码提示插件推荐
  • Kali Linux 无线网络攻防教学:从虚拟机安装到抓取 WIFI 握手包
  • Web 开发者转型 AI:多模态 Agent 图像识别 Skills 全栈实战
  • ClawX:OpenClaw 可视化桌面客户端使用指南
  • Stable Diffusion 3.5 FP8 镜像部署与商业授权说明
  • CARRY4进位链在TDC中的行为仿真:从抽头延迟到温度计码
  • Java 多线程进阶:JUC 核心类与线程安全集合
  • 机器人开源项目精选:覆盖科研、教育、工业与医疗的66个仓库
  • Dify 接入企业微信群聊机器人配置指南
  • Jetpack Compose 浮动按钮与进度条组件使用示例

相关免费在线工具

  • 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