跳转至

Async def 和普通函数有什么本质区别?

async def 和普通函数的本质区别,一句话:

普通函数是“做完了才回来”,async def 是“先给你一个承诺,之后在事件循环里一步步完成”。

下面我快速拆一下👇


🔄 核心差异对比

查看内嵌表格


🔍 一个最简例子

# 普通函数
def normal():
    return "done"

# 异步函数
async def async_func():
    await some_io()   # 这里可以暂停不阻塞线程
    return "done"
  • normal():立刻执行,当前线程必须等它结束。

  • async_func():得到的是一个协程对象,不会立刻执行,必须交给事件循环(asyncio.runawait)才真正运行。


🧠 为什么这是“本质”区别?

  • 普通函数是“给你结果”,调用栈是连续的,返回意味着结束。

  • async def 是“给你一个任务包”,任务可以分步进行,中间可以穿插其他任务,实现了单线程内的协作式多任务。

这就是为什么 async def 能做高并发 IO,普通函数不能——普通函数的阻塞会卡死整个线程,而 async 函数的阻塞会被 await 转化为让出执行权。


📌 选用口诀

  • 全是 CPU 计算 → 普通函数

  • 有大量 IO(网络、文件)且想单线程高并发 → async def + 异步库

  • 简单脚本、不需要并发 → 普通函数就够了


这样讲,是不是把最本质的“调用生成协程对象、可暂停恢复”讲清楚了?如果需要,我们可以再聊聊协程调度那层。