技术杂烩· · 发布于 2026-01-28 10:40:16

Python 异步编程完全指南:asyncio 深度解析与实战应用

Python 异步编程完全指南:asyncio 深度解析与实战应用

第一章:异步编程基础概念

1.1 什么是异步编程?

异步编程是一种编程范式,允许程序在执行长时间操作时不阻塞主线程。通过异步编程,我们可以在等待 I/O 操作完成时执行其他任务。

传统同步编程的问题

# 同步方式 - 阻塞式
import time

def fetch_data():
time.sleep(2) # 模拟网络请求
return "数据"

print("开始请求")
data = fetch_data() # 程序在这里被阻塞 2 秒
print(f"收到: {data}")
print("继续执行")

预期输出

开始请求
(等待 2 秒)
收到: 数据
继续执行

1.2 异步编程的优势

特性同步编程异步编程
响应性
资源利用低效高效
代码复杂度简单复杂
适用场景简单任务I/O密集型

第二章:asyncio 核心概念

2.1 事件循环(Event Loop)

事件循环是异步编程的核心,它负责管理所有异步任务的执行。

import asyncio

async def hello():
print("Hello")
await asyncio.sleep(1)
print("World")

# 创建事件循环并运行
asyncio.run(hello())

执行步骤

  1. 创建事件循环
  2. 注册 hello() 协程
  3. 事件循环开始执行
  4. 遇到 await 时暂停,执行其他任务
  5. 1 秒后恢复执行
  6. 打印 "World"

2.2 协程(Coroutine)

协程是用 async def 定义的函数,可以在执行过程中暂停和恢复。

async def fetch_user(user_id):
    print(f"开始获取用户 {user_id}")
    await asyncio.sleep(1)  # 模拟网络请求
    print(f"完成获取用户 {user_id}")
    return f"User {user_id}"

# 调用协程返回一个 coroutine 对象
coro = fetch_user(1)
print(type(coro)) # <class 'coroutine'>

2.3 任务(Task)

任务是对协程的包装,允许在后台运行。

import asyncio

async def background_task():
for i in range(3):
print(f"后台任务: {i}")
await asyncio.sleep(1)

async def main():
# 创建任务
task = asyncio.create_task(background_task())

# 主程序继续执行
print("主程序开始")
await asyncio.sleep(2)
print("主程序继续")

# 等待任务完成
await task
print("所有任务完成")

asyncio.run(main())

预期输出

主程序开始
后台任务: 0
后台任务: 1
主程序继续
后台任务: 2
所有任务完成

第三章:实战应用

3.1 并发网络请求

import asyncio
import aiohttp

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

async def main():
urls = [
'https://example.com/api/1',
'https://example.com/api/2',
'https://example.com/api/3',
]

async with aiohttp.ClientSession() as session:
tasks = [fetch_url(session, url) for url in urls]
results = await asyncio.gather(*tasks)
return results

# 运行
# results = asyncio.run(main())

3.2 超时控制

async def slow_operation():
    await asyncio.sleep(10)
    return "完成"

async def main():
try:
result = await asyncio.wait_for(
slow_operation(),
timeout=2.0 # 2 秒超时
)
except asyncio.TimeoutError:
print("操作超时!")

asyncio.run(main())

常见错误与解决方案

错误原因解决方案
RuntimeError: no running event loop在非异步函数中使用 await使用 asyncio.run() 或在 async 函数中调用
任务被取消事件循环关闭前任务未完成使用 await 等待任务完成
死锁相互等待的任务使用 asyncio.gather() 并发执行

性能优化建议

  1. 使用连接池:复用连接以减少开销
  2. 合理设置超时:避免无限等待
  3. 监控事件循环:检测阻塞操作
  4. 使用线程池:处理 CPU 密集型任务

希望这份详细指南能帮助你掌握 Python 异步编程!有任何问题欢迎讨论。

登录后操作
暂无回复
🛡️ 权限设置
提示:选择"私有"会覆盖等级限制。
app
安装到桌面,像 App 一样使用
打开更快 · 全屏体验 · 入口常驻

iPhone/iPad 安装到桌面

  1. 使用 Safari 打开本站(微信/QQ 内置浏览器不稳定)。
  2. 点击底部 分享 按钮(方框上箭头)。
  3. 选择 添加到主屏幕,确认即可。
首页
搜索
动态
发帖
私信
我的