Python学习(12) ----- Python的异步操作


🧠 1. 先理解:什么是“同步”和“异步”

举个生活中的例子👇

同步(synchronous)

你去煮泡面:

  1. 烧水 → 等水开
  2. 放面 → 等面煮熟
  3. 吃面

每一步都要“等前一步完成”才能继续。
所以整个过程花的时间 = 烧水时间 + 煮面时间。


异步(asynchronous)

你更聪明一点 😎:

  1. 开水壶烧水 🔥
  2. 在水还没开的时候,顺便切点菜、看个视频 🎬
  3. 水开时“提醒你”,再去放面

异步的意思就是:不用一直等一个任务做完,能在等待的同时去干别的事


⚙️ 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
文件IOaiofiles异步读写文件
数据库操作asyncpg, databases异步访问 PostgreSQL 等
Web框架FastAPI, aiohttp.web异步 Web 服务

✅ 7. 小结

关键点说明
async def定义异步函数
await等待一个异步操作完成
asyncio.run()启动事件循环并运行主协程
asyncio.gather()并发执行多个协程
asyncio.create_task()创建并启动协程任务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值