python 异步编程
目录
背景和价值
好的!我尽量用更简单、更通俗的语言来解释 async
和 await
。
1. 什么是异步编程?
想象一下你在做饭:
- 如果你按顺序做(先煮饭,再炒菜,最后洗碗),会花很长时间。
- 如果你异步做(煮饭的同时炒菜,然后洗碗),效率会更高。
异步编程就是让程序在等待某些任务(比如下载文件、访问数据库)时,不用干等着,而是可以去做其他事情。
2. async
和 await
的作用
async
:用来定义一个“异步函数”。这个函数可以暂停和恢复。await
:用来告诉程序“你等一会儿,等这个任务完成后再继续”。
当主线程执行到await 语句的时候会做什么?
当主线程执行到 await 语句时,它会暂停当前函数的执行,把控制权交还给事件循环(Event Loop),然后事件循环会去执行其他任务。等到 await 后面的任务完成后,再恢复执行当前函数。
3. 举个例子
假设你要做两件事:
- 煮咖啡(需要 3 秒)
- 烤面包(需要 2 秒)
如果用普通方法(同步),你会先煮咖啡,再烤面包,总共需要 5 秒。
如果用异步方法,你可以同时开始煮咖啡和烤面包,总共只需要 3 秒(因为烤面包更快)。
4. 代码演示
普通方法(同步)
import time
def make_coffee():
print("开始煮咖啡")
time.sleep(3) # 等待 3 秒
print("咖啡煮好了")
def toast_bread():
print("开始烤面包")
time.sleep(2) # 等待 2 秒
print("面包烤好了")
def main():
make_coffee()
toast_bread()
main()
输出:
开始煮咖啡
咖啡煮好了
开始烤面包
面包烤好了
总时间:5 秒
异步方法
import asyncio
async def make_coffee():
print("开始煮咖啡")
await asyncio.sleep(3) # 等待 3 秒
print("咖啡煮好了")
async def toast_bread():
print("开始烤面包")
await asyncio.sleep(2) # 等待 2 秒
print("面包烤好了")
async def main():
await asyncio.gather(make_coffee(), toast_bread()) # 同时执行两个任务
await main()
输出:
开始煮咖啡
开始烤面包
面包烤好了
咖啡煮好了
总时间:3 秒
5. 通俗总结
async
:告诉 Python 这个函数可以“暂停”。await
:告诉 Python“等这个任务完成后再继续”。- 好处:可以同时做多件事,效率更高。
6. 常见场景
- 网络请求:比如同时下载多个文件。
- 数据库操作:比如同时查询多个表。
- Web 服务器:比如同时处理多个用户的请求。
7. 注意事项
- 异步函数必须用
await
来调用。 - 异步代码需要运行在
asyncio.run()
中。 - 不是所有任务都能异步,只有那些可以“等待”的任务才行(比如网络请求、文件读写)。
希望这样解释更清楚了!如果还有疑问,随时问我! 😊