python 异步编程

背景和价值

好的!我尽量用更简单、更通俗的语言来解释 asyncawait


1. 什么是异步编程?

想象一下你在做饭:

  • 如果你按顺序做(先煮饭,再炒菜,最后洗碗),会花很长时间。
  • 如果你异步做(煮饭的同时炒菜,然后洗碗),效率会更高。

异步编程就是让程序在等待某些任务(比如下载文件、访问数据库)时,不用干等着,而是可以去做其他事情。


2. asyncawait 的作用

  • async:用来定义一个“异步函数”。这个函数可以暂停和恢复。
  • await:用来告诉程序“你等一会儿,等这个任务完成后再继续”。

当主线程执行到await 语句的时候会做什么?
当主线程执行到 await 语句时,​它会暂停当前函数的执行,把控制权交还给事件循环(Event Loop)​,然后事件循环会去执行其他任务。等到 await 后面的任务完成后,再恢复执行当前函数。

3. 举个例子

假设你要做两件事:

  1. 煮咖啡(需要 3 秒)
  2. 烤面包(需要 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() 中。
  • 不是所有任务都能异步,只有那些可以“等待”的任务才行(比如网络请求、文件读写)。

希望这样解释更清楚了!如果还有疑问,随时问我! 😊

参考资料

posted @ 2025-03-19 15:16  向着朝阳  阅读(39)  评论(0)    收藏  举报