Python学习(12) ----- Python的异步操作
🧠 1. 先理解:什么是“同步”和“异步”
举个生活中的例子👇
同步(synchronous)
你去煮泡面:
- 烧水 → 等水开
- 放面 → 等面煮熟
- 吃面
每一步都要“等前一步完成”才能继续。
所以整个过程花的时间 = 烧水时间 + 煮面时间。
异步(asynchronous)
你更聪明一点 😎:
- 开水壶烧水 🔥
- 在水还没开的时候,顺便切点菜、看个视频 🎬
- 水开时“提醒你”,再去放面
异步的意思就是:不用一直等一个任务做完,能在等待的同时去干别的事。
⚙️ 2. 在程序里这是什么意思?
在代码里,“异步”通常用来等待一些耗时的操作,比如:
- 网络请求(下载网页、发 HTTP 请求)
- 文件读写
- 数据库查询
这些操作不是 CPU 运算慢,而是IO(输入输出)慢。
Python 的异步操作就是在这些“等待IO”的时候,让程序能先去做别的事。
🐍 3. Python异步的语法:async + await
最核心的两个关键词:
async:声明一个异步函数await:在里面等待一个异步操作完成
import asyncioasync 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 asyncioasync 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 asyncioasync 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 asyncioasync 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 asyncioasync 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 asyncioasync 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() | 创建并启动协程任务 |
