1. Python中的同步与异步编程基础概念
在Python开发中,同步(Synchronous)和异步(Asynchronous)是两种截然不同的编程范式。同步代码按照顺序执行,每一行代码必须等待前一行执行完成后才能运行,就像在餐厅排队点餐,必须等前一个人完成才能轮到下一位。而异步编程则允许任务在等待某些操作(如I/O)完成时,将控制权交还给事件循环,转而执行其他任务,这类似于在餐厅取号后可以先去逛街,等号到了再回来。
Python通过asyncio模块原生支持异步编程,其核心组件包括:
- 协程(Coroutine):使用async def定义的函数,能够暂停和恢复执行
- 事件循环(Event Loop):异步任务的调度中心
- Future/Task:表示异步操作结果的对象
同步代码示例:
python复制def sync_func():
print("第一步")
time.sleep(1) # 阻塞调用
print("第二步")
异步代码示例:
python复制async def async_func():
print("第一步")
await asyncio.sleep(1) # 非阻塞调用
print("第二步")
关键区别在于:
- 同步代码中time.sleep()会阻塞整个线程
- 异步代码中asyncio.sleep()会将控制权交还事件循环
- 异步函数必须使用await关键字调用其他异步操作
注意:在Jupyter Notebook等交互环境中运行异步代码时,需要使用
await直接调用协程,或者使用asyncio.run()来启动事件循环。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 异步编程的核心机制与实现原理
2.1 事件循环工作机制
事件循环是异步编程的核心引擎,其工作流程可以分解为:
- 维护一个任务队列(Task Queue)
- 不断检查队列中的任务
- 执行就绪任务直到遇到await
- 挂起当前任务,执行下一个就绪任务
- 当挂起的任务等待的操作完成时,将其重新放入队列
python复制# 手动创建事件循环示例
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(main())
finally:
loop.close()
2.2 协程与生成器的关系
Python的协程实际上是基于生成器实现的。当函数包含yield或await表达式时,它就成为可以暂停和恢复的对象。关键区别在于:
| 特性 | 生成器 | 协程 |
|---|---|---|
| 关键字 | yield | async/await |
| 数据流向 | 生产者→消费者 | 双向通信 |
| 主要用途 | 惰性求值 | 并发执行 |
| 调度方式 | 手动.next() | 自动事件循环 |
