🧠 1. 先理解:什么是“同步”和“异步”
举个生活中的例子👇
同步(synchronous)
你去煮泡面:
- 烧水 → 等水开
- 放面 → 等面煮熟
- 吃面
每一步都要“等前一步完成”才能继续。
所以整个过程花的时间 = 烧水时间 + 煮面时间。
异步(asynchronous)
你更聪明一点 😎:
- 开水壶烧水 🔥
- 在水还没开的时候,顺便切点菜、看个视频 🎬
- 水开时“提醒你”,再去放面
异步的意思就是:不用一直等一个任务做完,能在等待的同时去干别的事。
⚙️ 2. 在程序里这是什么意思?
在代码里,“异步”通常用来等待一些耗时的操作,比如:
- 网络请求(下载网页、发 HTTP 请求)
- 文件读写
- 数据库查询
这些操作不是 CPU 运算慢,而是IO(输入输出)慢。
Python 的异步操作就是在这些“等待IO”的时候,让程序能先去做别的事。
🐍 3. Python异步的语法:async + await
最核心的两个关键词:
async:声明一个异步函数await:在里面等待一个异步操作完成
import asyncio
async def cook_noodles():
print("开始烧水...")
await asyncio.sleep(3) # 模拟耗时3秒
print("水开了,放面!")
await asyncio.sleep(2)
print("面煮好了!")
async def main():
await cook_noodles()
asyncio.run(main())
输出:
开始烧水...
(3秒后)
水开了,放面!
(2秒后)
面煮好了!
这和同步差不多,只是语法变了——还没有体现异步的优势。
⚡ 4. 真正的异步:多个任务同时进行
import asyncio
async def cook_noodles():
print("烧水中...")
await asyncio.sleep(3)
print("面好了!")
async def watch_video():
print("看视频中...")
await asyncio.sleep(2)
print("视频看完!")
async def main():
await asyncio.gather(
cook_noodles(),
watch_video()
)
asyncio.run(main())
输出(几乎同时开始):
烧水中...
看视频中...
(2秒后)
视频看完!
(3秒后)
面好了!
💡 你会发现:
- “烧水”没耽误“看视频”
- 整个程序总耗时只有 3 秒,而不是 5 秒
这就是异步的威力。
📦 5. 小结
| 概念 | 同步 | 异步 |
|---|---|---|
| 执行方式 | 一步接一步 | 可以并发执行 |
| 典型用途 | 普通逻辑、CPU密集 | 网络请求、IO操作 |
| Python关键字 | 无 | async / await |
| 核心库 | — | asyncio |
✅ 一句话总结
Python 的异步操作让程序在“等待”的时候也能去干别的事,从而更高效地利用时间。
🧩 1. 定义异步函数:async def
普通函数这样写:
def say_hello():
print("Hello")
异步函数这样写:
async def say_hello():
print("Hello")
区别:
- 加了
async的函数不会立刻执行,而是返回一个 协程对象(coroutine)。 - 要执行它,必须
await它,或者交给事件循环去跑。
🧠 2. 如何运行异步函数
✅ 方式 1:asyncio.run()
这是最常用也最简单的写法。
import asyncio
async def say_hello():
print("Hello, Async!")
async def main():
await say_hello()
asyncio.run(main())
解释:
asyncio.run(main())会启动一个事件循环- 在里面运行
main()协程 main()里面再await其他异步函数
⚙️ 3. await 的作用
在异步函数内部,你可以用 await 来“等待”另一个异步操作的完成。
import asyncio
async def slow_task():
print("Start task")
await asyncio.sleep(2) # 模拟耗时操作
print("Task done")
async def main():
print("Before await")
await slow_task()
print("After await")
asyncio.run(main())
输出:
Before await
Start task
(2秒后)
Task done
After await
这里的 await asyncio.sleep(2) 就相当于在等待一个耗时操作。
但等待时 Python 可以去执行别的异步任务(这就是“并发”的关键)。
⚡ 4. 同时运行多个异步任务:asyncio.gather
import asyncio
async def download(name, delay):
print(f"{name} start")
await asyncio.sleep(delay)
print(f"{name} done")
async def main():
await asyncio.gather(
download("A", 3),
download("B", 2),
download("C", 1)
)
asyncio.run(main())
输出(顺序体现了异步执行):
A start
B start
C start
C done
B done
A done
✅ 三个任务几乎同时开始
✅ 整体执行时间 ≈ 最慢的任务(3秒)
而不是 3+2+1 = 6 秒。
🚀 5. 如果要循环创建多个异步任务?
可以用 create_task():
import asyncio
async def worker(id):
print(f"Worker {id} start")
await asyncio.sleep(2)
print(f"Worker {id} done")
async def main():
tasks = []
for i in range(5):
task = asyncio.create_task(worker(i))
tasks.append(task)
await asyncio.gather(*tasks)
asyncio.run(main())
输出:
Worker 0 start
Worker 1 start
Worker 2 start
Worker 3 start
Worker 4 start
(2秒后)
Worker 0 done
Worker 1 done
Worker 2 done
Worker 3 done
Worker 4 done
👉 所有任务同时执行,非常高效。
📦 6. 异步函数常用于哪些场景?
| 场景 | 示例库 | 说明 |
|---|---|---|
| 网络请求 | aiohttp | 异步版的 requests |
| 文件IO | aiofiles | 异步读写文件 |
| 数据库操作 | asyncpg, databases | 异步访问 PostgreSQL 等 |
| Web框架 | FastAPI, aiohttp.web | 异步 Web 服务 |
✅ 7. 小结
| 关键点 | 说明 |
|---|---|
async def | 定义异步函数 |
await | 等待一个异步操作完成 |
asyncio.run() | 启动事件循环并运行主协程 |
asyncio.gather() | 并发执行多个协程 |
asyncio.create_task() | 创建并启动协程任务 |
9463

被折叠的 条评论
为什么被折叠?



